UIPopovercontroller dealloc достигнут, пока всплывающее окно все еще видно - PullRequest
111 голосов
/ 17 января 2012

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

Ответы [ 3 ]

203 голосов
/ 17 января 2012

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];
11 голосов
/ 17 января 2012

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

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

Тим

10 голосов
/ 12 марта 2013

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

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

, а затем изменить

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

для

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