ОК, поэтому Apple принес нам ARC, что здорово. После рефакторинга моего приложения в ARC почти все работает отлично, и теперь намного легче разрабатывать и поддерживать.
Есть только одна проблема, которую я до сих пор не могу понять.
Моя программа управления заданиями показывает разные детализированные предложения, заказы и т.д. в их собственных окнах. Поэтому у меня есть специальный класс, в котором WindowControllers получает выделение и инициируется с помощью initWithWindowNibName, а затем окно отображается с showWindow:
DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];
До ARC экземпляр WindowController сделал выпуск, как показано в documentation:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Но теперь с ARC это больше невозможно, а что еще хуже, в моем специальном классе, где WindowController назначается и инициируется, тот же windowController освобождается ARC, потому что нет указателя на windowController.
Моя идея состояла в том, чтобы скопировать windowController в управляемый массив:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];
А в окнеКонтроллеры делегировать метод windowWillClose я отправляю уведомление своему специальному классу:
- (void)windowWillClose:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}
В моем специальном классе я слушаю уведомление и удаляю объект из массива:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
[proposalWindowArray removeObjectIdenticalTo:[notification object]];
}
Это работает, но я до сих пор не считаю, что это правильный путь.
Есть ли у кого-то такая же проблема или подсказка, чтобы сделать ее лучше?