2009-10-30 17 views
10

Czytam się o kodowaniu i dekodowaniu i zauważyłem, że czasami ludzie miss zachowuje się do końca, ja też zauważyłem, że zachowują się czasami używane w niektórych varables ale nie innych. Mogę zapytać ...Użycie zatrzymania w initWithCoder?

(1) Jaki jest cel tego zachowania i dlaczego jest to czasami nie jest potrzebna?

(2) Czy korzystanie z funkcji zatrzymywania implikuje, że muszę dopasować ją do wydania, a jeśli tak, to gdzie?

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [[decoder decodeObjectForKey: @"CardName"] retain]; 
    email = [[decoder decodeObjectForKey: @"CardEmail"] retain]; 
} 

lub

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [decoder decodeObjectForKey: @"CardName"]; 
    email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

gary

+0

Najprawdopodobniej widoczne próbki kodu, które nie zachowują jawnie zdekodowanego obiektu, wykorzystują metody ustawiające w celu odebrania prawa własności. – Chuck

Odpowiedz

12

Twój pierwszy snippit reprezentuje poprawne zachowanie. Metoda -decodeObjectForKey: nie zawiera słowo init, copy lub new, więc nie ma obietnica o tym, czy obiekt zwrócony pozostanie wokół, a jeśli tak, to na jak długo. Jeśli twój obiekt potrzebuje swoich kropek, aby pozostały w pobliżu, to powinien je odebrać z dekodera. Ten -retain będzie musiał być zbalansowany z -release, który będzie w metodzie obiektu obiektu -dealloc (więc obiekt jest tworzony z niektórymi początkowymi znakami, które zachowuje i uwalnia swoje ivars, gdy jest zniszczony). Tak:

- (void)dealloc { 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

Zachować/release taniec nie jest potrzebne:

  • jeśli używasz zbieranie śmieci

  • jeśli obiekt nie wymaga zastrzeżenia własności jego ivars. To nie często; Delegaci zwykle nie są zatrzymywane (ale zwykle nie są archiwizowane) i właściwości zadeklarowane z modyfikatorem assign nie są obaj.

+0

Prawdopodobnie potrzebuję kolejnej podróży po przewodniku zarządzania pamięcią, czy mogę zapytać, czy przydzielając prostą klasę, która zawiera pojedynczą zmienną instancji NSString, czy powinienem zwolnić to w moim dealloc, czy też zostanie zwolniony po zwolnieniu instancji zawierającej? – fuzzygoat

+0

Tak, po ustawieniu należy zachować zmienną instancji i zwolnić ją, gdy nie jest już potrzebna. Mam wpis na blogu z zestawem linków do artykułów zarządzania pamięcią: http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html –

+0

Dziękuję Graham, myślę, że już tam dotrę , Połączyłem Twój post na blogu, by móc go później wykorzystać. Miłego weekendu. – fuzzygoat

9

Możliwe, że wprowadzili Cię w błąd także osoby korzystające z nieruchomości. Jego możliwe, że widziałem ludzi robi:

- (id) initWithCoder: (NSCoder *) decoder { 
    self.name = [decoder decodeObjectForKey: @"CardName"]; 
    self.email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

co byłoby w porządku, jeśli nazwa i adres e-mail zostały określone jako „zachowują” właściwości. Oczywiście wdajesz się w spór o to, czy jest to legalne/wskazane, by używać akcesorów własności w metodach inicjalizacji/dealloc - niektórzy mówią tak, niektórzy mówią: nie, Apple wydaje się być po stronie nie, ale nigdy tak naprawdę nie dał dobry powód, który widzę.

Powiązane problemy