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