UIPopoverController освобождение вызова - среда ARC - PullRequest
19 голосов
/ 29 октября 2011

При повторном отображении контроллера popover (после его закрытия и повторного отображения) я получаю следующую ошибку:

Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: «- [UIPopoverController dealloc] достигнут, пока всплывающее окно все еще видно. '

Трассировка стека - это всего лишь гексагон, и SIGABRT каждый раз происходит в UIApplicationMain. Вот код, который вызывает кнопка:

- (IBAction)createNewScore:(id)sender {
    if (self.pc)
        if (self.pc.popoverVisible)
            return;
        else
        // Breakpoint is hit here—crashes after this line
            [self.pc presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    NGDocumentInfoViewController *documentInfoVC = [[NGDocumentInfoViewController alloc] initWithBlankDocumentTargetInManagedObjectContext:self.context];
    UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:documentInfoVC];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneCreatingNewScore:)];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCreatingNewScore:)];
    navc.navigationBar.topItem.leftBarButtonItem = doneButton;
    navc.navigationBar.topItem.rightBarButtonItem = cancelButton;
    CGSize popoverSize = CGSizeMake(documentInfoVC.view.bounds.size.width, documentInfoVC.view.bounds.size.height);
    documentInfoVC.contentSizeForViewInPopover = popoverSize;
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navc];
    popover.delegate = self;
    self.pc = popover;
    [popover presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

Я бы хотел оставить поповер, который бы исправил проблему, но это среда ARC, поэтому у меня нет сохранения. Есть ли способ исправить ошибку (не отключая ARC для файла и не делая вручную память для всего файла)?

Редактировать: Всплывающее окно сохраняется в виде ивара:

@property (strong) UIPopoverController *pc;
<ч />

У кого-нибудь есть решение этой проблемы (возможно, переопределение ARC)? Я подам заявку на БР, как предлагает CodaFi, но решение все равно будет хорошим, так как это препятствие в крупном проекте. Если это невозможно, то, я полагаю, я сам сделаю это.

Ответы [ 2 ]

18 голосов
/ 22 января 2012

Я столкнулся с той же проблемой и исправил ее, сохранив контроллер popover в сильной переменной экземпляра, как это было предложено, И явно отклонил его перед сбросом свойства с помощью нового контроллера popover, выделенного во втором запуске действия. В вашем примере вы должны добавить что-то вроде этого:

- (IBAction)createNewScore:(id)sender {
    if (self.pc) {
         [self.pc dismissPopoverAnimated:YES];
    }
3 голосов
/ 08 ноября 2011

Если ваш поповер хранится в качестве строгой ссылки, он не может быть освобожден. Единственная возможность, когда он может быть освобожден, - это ситуация, когда объект, содержащий сильную ссылку (self в вашем примере), также освобожден.

Я думаю, что важным вопросом является то, что вы делаете со своими представлениями, когда всплывающее окно видно.

Если вы уже проверили это, то это должно быть ошибкой фреймворка.

...