OK, więc Apple wprowadził do nas ARC, co jest świetne. Po refakturowaniu mojej aplikacji do ARC prawie wszystko działa dobrze i teraz jest o wiele łatwiej opracowywać i utrzymywać.Konwertowanie obiektów zwalniających do ARC
Jest tylko jeden problem, którego wciąż nie mogę rozgryźć.
Mój program zarządzania zadaniami wyświetla różne informacje o propozycjach, zamówieniach itd. W ich własnych oknach. Więc mam specjalną klasę gdzie WindowControllers zostaje przydzielony i zainicjowane z initWithWindowNibName a następnie okno jest pokazany z ShowWindow:
DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];
Przed ARC instancję WindowController zrobił uwalnianie jak pokazano na documentation:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Ale teraz z ARC nie jest to już możliwe i co jest jeszcze gorsze, w mojej specjalnej klasie, gdzie WindowController jest przydzielany i inicjowany, ten sam WindowController jest zwalniany przez ARC, ponieważ nie ma wskaźnika do windowController.
Mój pomysł był aby skopiować windowController się z mutuable tablicy:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];
A w metodzie windowControllers delegata windowWillClose mogę wysłać powiadomienie do mojego specjalnego Klasa:
- (void)windowWillClose:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}
W mojej klasie specjalnej Wysłuchuję powiadomienia i usuwam obiekt z tablicy:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
[proposalWindowArray removeObjectIdenticalTo:[notification object]];
}
Działa, ale nadal nie wierzę, że to jest poprawna metoda.
Czy ktoś ma ten sam problem lub napiwek, aby go poprawić?
Twoja nowa metoda jest zasadniczo poprawna. W przypadku ARC należy zachować wyraźne odwołania do obiektów, aby kompilator mógł poprawnie śledzić wywołania funkcji keep/release. W rzeczywistości uważam, że powinieneś unikać takich sztuczek jak nazywanie 'release' w ogóle metodami wywołania zwrotnego, niezależnie od tego, czy używasz ARC. –
@RobKeniger: Co proponujesz zamiast tego? Wyobraźmy sobie, że znajdujemy się w delegacie aplikacji, który przekazuje otrzymane akcje do przeglądania/kontrolerów okien i zazwyczaj jest zaangażowanych wiele różnych kontrolerów. Tworzenie właściwości dla każdej z nich wydaje się niepotrzebne. –