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


111

나는 내 질문에 대한 대답을 찾았지만 그들 중 어느 것도 도움이되지 않았다고 확신합니다. 여기서 나는을 제시해야합니다 간단한 코드를 가지고 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의 혜택을받을 때 특별히 고려해야 할 사항이 있습니까?

답변:


203

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];

1
아, 알겠습니다. 그러나 이것은 UIAlertView와 같지 않습니까? 나는 그것을위한 ivar를 가지고 있지 않다. 나는 단지 내가 필요로 할 때마다 그것을 init 할당하고 그것을 보여준 다음 해제한다. popovercontroller가 다른 점은 무엇입니까?
Mikayil Abdullayev

17
@Mikayil alertView는 수퍼 뷰 (모든 뷰가 그렇듯이)에 의해 유지되지만 popoverController는 뷰가 아니므로 슈퍼 뷰가 없으므로 유지하지 않으면 누구도 유지하지 않습니다 (또는 현재 메서드보다 더 긴 범위를 가진 강력한 변수 (예 : iVar)에 저장합니다.
fzwo

1
그러나 UIPopoverController의 보유 수에 대해 여전히 혼란 스럽습니다. 내가 할당하고 초기화하기 전에 체크를했기 때문입니다. 그리고 그것이없는 경우에만 나는 새로운 것을 할당합니다. 그러나 처음으로 할당 한 후에는 결코 얻지 못합니다. 한 번 메서드를 호출한다는 의미입니다. 거기에 내 ivar를 할당하고 초기화합니다. 그리고 다음에이 메서드를 다시 호출 할 때 ivar가 이미 할당 된 것을 찾습니다. ARC가이를 처리하면 언제 릴리스합니까? 아니면 자동 해제합니까?
Mikayil Abdullayev

인스턴스 변수는 ARC로 출시 @Mikayil 개체가 해제 또는 당신이 그들을 설정할 때 전무로 할 때
펠릭스

그러나 그들은에서 문서에이 문제를 언급하지 않은 방법을 사용하는 가 지역 변수를 사용하여 섹션
아 미트 Battan에게

11

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

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


할당이 취소되기 전에 먼저 볼 수 있어야하지 않나요?
Mikayil Abdullayev

10

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

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

그리고 변경

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

...에 대한

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

11
.h 파일에 넣을 필요가 없습니다. 그것은 그것을 공개하고 원하지 않는 한 .m 파일의 속성으로 만드십시오.
Joshua Dance
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.