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 :)
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
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
Dobra, myślę, że rozumiem. Wielkie dzięki. – cabaret