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