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 ответа:
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];