2011-08-03 15 views
5

Czytam książki przez Big Nerd Ranch na temat programowania iOS i miałem pytanie o programie Hypnotime one tworzyć w rozdziale 7.iOS zarządzanie pamięcią podstawowy

W pewnym momencie oni realizować w następujący sposób:

- (void)showCurrentTime:(id)sender 
{ 
    NSDate *now = [NSDate date]; 

    static NSDateFormatter *formatter = nil; 

    if (!formatter) { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setTimeStyle:NSDateFormatterShortStyle]; 
    } 

    [timeLabel setText:[formatter stringFromDate:now]]; 

} 

Moje pytanie dotyczy NSDateFormatter *formatter. Formater zostanie utworzony za pomocą alloc i init. Zawsze się dowiedziałem, że cokolwiek z alloc musi być gdzieś wydane, prawda? Kiedy formatter zostanie przekazany do timeLabel, czy nie wysyła do niego timeLabel? I nie mogę (nie powinienem?) Wydać następnie formatter?

przeglądałem przez kod na kilku następnych stronach i nie mogę znaleźć żadnego komunikatu odłączenia wszędzie, z wyjątkiem release będąc wysłać do timeLabel w dealloc.

Czy mieszam rzeczy tutaj? Czy istnieje powód, dla którego formatter nie powinien być wydany przeze mnie? Chcę być dobrym obywatelem pamięci. Każda pomoc jest doceniana :)

Odpowiedz

1

one ogłoszony formatowania jako statyczne więc zamiarem jest, aby utrzymać przy życiu formatowania całego cyklu życia aplikacji. Będzie to spowodowane wydajnością i może być wstępną optymalizacją, więc nie traktuj tego jako najlepszej praktyki w przyszłym rozwoju.

//static (even in a method) will allow formatter to live during entire app lifecycle 
static NSDateFormatter *formatter = nil; 

//Check if formatter has been set (this is not thread safe) 
if (!formatter) { 
    //Set it once and forget it, it wont be a leak, and it wont ever be released 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeStyle:NSDateFormatterShortStyle]; 
} 
+0

Dzięki za radę. Jeśli jest on utrzymywany przy życiu przez cały czas trwania aplikacji, czy oznacza to, że powinienem zwolnić go w dealloc, czy też nie zwolnić go w ogóle? Trochę mylić o tym, szczerze mówiąc. – cabaret

+0

Nie jest przeznaczona do zwolnienia i nie spowoduje przecieku pamięci, chyba że ponownie przypisze formatator bez zwalniania go. Właśnie dlatego istnieje kontrola if. – Joe

+0

Dobra, myślę, że rozumiem. Wielkie dzięki. – cabaret

1

setText po prostu pobiera ciąg (nie sam formater), więc formater nie zostanie zachowany. Zakładam, że używają one formatera gdzie indziej w kontrolerze, a więc zostają zwolnione w dealloc

+0

Nie przeszkadza ci to w dealloc, nie widziałem, żeby był statyczny, ale pierwsza część pozostaje prawdziwa – ksn

+0

OK, dzięki. Będę o tym pamiętać przy ustawianiu setText. :) – cabaret

2

Ze względu na słowo kluczowe static, formatter pozostanie dostępne do następnego razu, gdy metoda zostanie wywołana, jako zmienna globalna - cóż, bez będąc globalnego

wpis See wikipedia o static

+0

Dzięki za szybką odpowiedź. Wpis wiki wyczyścił kilka rzeczy o 'static' up :) – cabaret