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]
до тех пор, пока... ошибка и программа выйдет из строя. Я не делаю никаких удержаний, relase или autoreleases в соответствии с ARC. Есть ли какое-либо особое соображение при UIPopoverControllers
при использовании ARC?
Ответы
Ответ 1
UIPopoverControllers всегда должны храниться в переменной экземпляра. Хорошая практика - создать для него сильное свойство.
UPDATE:
Как и в 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];
Ответ 2
Когда функция выходит, нет другой ссылки на контроллер popover, поэтому она освобождена слишком рано.
Попробуйте добавить его как члена своего класса.
Тим
Ответ 3
Добавив ответ @phix23, создайте свойство * poc следующим образом:
@property (nonatomic, retain) IBOutlet UIPopoverController *poc;
а затем измените
UIPopoverController *poc = [[UIPopoverController alloc]
initWithContentViewController:picker];
для
self.poc = [[UIPopoverController alloc]
initWithContentViewController:picker];