ОК, 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 выделен и инициирован, ARC освобождает тот же windowController, потому что нет указателя на 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]];
}
Это работает, но я все еще не верю, что это правильный путь.
У кого-нибудь есть такая же проблема или совет, чтобы сделать его лучше?