[ios] 팝 오버가 여전히 표시되는 동안 UIPopovercontroller dealloc에 ​​도달했습니다.

나는 내 질문에 대한 대답을 찾았지만 그들 중 어느 것도 도움이되지 않았다고 확신합니다. 여기서 나는을 제시해야합니다 간단한 코드를 가지고 UIImagePickerController내를 UIPopoverController:

-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc]
                            initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem
            permittedArrowDirections:UIPopoverArrowDirectionAny
                            animated:NO];
}

이제는 처음부터 [UIPopoveController dealloc]… 오류가 발생하고 프로그램이 충돌합니다. ARC에 따라 유지, 해제 또는 자동 해제를 수행하지 않습니다. UIPopoverControllersARC의 혜택을받을 때 특별히 고려해야 할 사항이 있습니까?



답변

UIPopoverControllers는 항상 인스턴스 변수에 보관되어야합니다. 강력한 속성을 만드는 것이 좋습니다.

최신 정보:

iOS 8부터는 UIPopoverPresentationController. 그러면 프레젠테이션 컨트롤러에서 관리하므로 팝 오버에 대한 참조를 유지할 필요가 없습니다.

코드 예제 (iPhone 및 iPad 모두에서 작동) :

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];


답변

함수가 종료되면 팝 오버 컨트롤러에 대한 다른 참조가 없으므로 너무 일찍 할당 해제됩니다.

대신 수업 구성원으로 추가해보세요.


답변

@ phix23이 대답 한 내용을 추가하고 다음과 같이 * poc 속성을 만듭니다.

@property (nonatomic, retain) IBOutlet UIPopoverController *poc;

그리고 변경

UIPopoverController *poc = [[UIPopoverController alloc]
                            initWithContentViewController:picker];

…에 대한

self.poc = [[UIPopoverController alloc]
                            initWithContentViewController:picker];


답변