Преобразование самовыпускающихся объектов в ARC

Хорошо, поэтому Apple принесла нам ARC, и это здорово. После рефакторинга моего приложения в ARC почти все работает нормально, и теперь его намного проще разрабатывать и поддерживать.

Есть только одна проблема, которую я до сих пор не могу понять.

Моя программа управления заданиями показывает различную подробную информацию о предложениях, заказах и т. Д. В отдельных окнах. Итак, у меня есть специальный класс, в котором WindowControllers выделяется и запускается с помощью initWithWindowNibName, а затем отображается окно с помощью showWindow:

DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];

Перед ARC экземпляр WindowController выполнил выпуск, как показано в документации :

- (void)windowWillClose:(NSNotification *)notification
{
   [self autorelease];
}

Но теперь с ARC это больше невозможно, и что еще хуже, в моем специальном классе, где выделяется и запускается WindowController, тот же самый windowController освобождается ARC, потому что нет указателя на windowController.

Моя идея заключалась в том, чтобы скопировать windowController в изменяемый массив:

[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];

И в методе делегата windowControllers windowWillClose я отправляю уведомление своему специальному классу:

- (void)windowWillClose:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}

В моем специальном классе я слушаю уведомление и удаляю объект из массива:

- (void) proposalWindowWasClosed: (NSNotification *) notification
{
    [proposalWindowArray removeObjectIdenticalTo:[notification object]];
}

Это работает, но я все еще не верю, что это правильный путь.

Есть ли у кого-нибудь такая же проблема или совет, чтобы сделать его лучше?

10
задан Brent Royal-Gordon 21 January 2013 в 07:55
поделиться