Uipopovercontroller dealloc достигнут, пока popover все еще виден


Я уверяю вас, что я искал ответ в SO для моего вопроса, но ни один из них не был полезен. Здесь я получил простой код, который должен представить 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] займет время... ошибка и сбой программы. Я не делаю каких-либо удерживать,отпустить или autoreleases как за дуги. Есть ли какое-либо особое внимание с UIPopoverControllers когда извлекать пользу из дуги?

3 110

3 ответа:

UIPopoverControllers всегда должны храниться в переменной экземпляра. Это хорошая практика, чтобы создать сильное свойство для него.

обновление:

начиная с iOS 8, вы должны использовать UIPopoverPresentationController. Тогда вам не нужно хранить ссылку на popover, потому что он управляется контроллером презентации.

пример кода (работает как на 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];

когда функция завершает работу, нет никакой другой ссылки на контроллер popover, поэтому он освобождается слишком рано.

попробуйте добавить его в качестве члена вашего класса вместо этого.

Тим

добавив, что @phix23 ответил, создайте свойство * poc следующим образом:

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

а потом изменить

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

на

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