Wiem, że na podobne pytanie już udzielono odpowiedzi tutaj, ale chcę się upewnić, że rozumiem to trochę lepiej. Oto mój scenariusz ...
Mam metodę klasy pomocniczej, która zwraca przydzielony UIImageView, jak pokazano poniżej.
+(UIImageView *)tableCellButton{
return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease];
}
Następnie w jednej z moich metod UIViewController używam go jako takiego ..
UIImageView *imageView = [Helper tableCellButton];
imageView.frame = cell.backgroundView.bounds;
imageView.tag = 250;
[cell.backgroundView addSubview:imageView];
Moje pytanie dotyczy tego, jak wygląda ta pamięćwydany. Nie używam puli autorelease (innej niż utworzona przez aplikację), a zmienna nie jest iVar / Property (więc nie zostanie zwolniona po wywołaniu dealloc). W tym przypadku jestem odpowiedzialny za zwolnienie pamięci po Nazwałem to? Kiedy zaczyna się automatyczne wydawanie? Dziękujemy za pomoc!
Odpowiedzi:
1 dla odpowiedzi № 1Połączenie z autorelease
spowoduje release
do wysłania do obiektu następnym razem za pośrednictwem pętli zdarzeń. To będzie uwzględniać alloc
zadzwonię do ciebie tableCellButton
. Jedyny raz obiekt jest zatrzymany w środku addSubview
, który również sobie poradzi release
tego samego obiektu. Na podstawie powyższego kodu zarządzanie pamięcią tego obiektu jest sprawdzane.
1 dla odpowiedzi nr 2
Każda iteracja runloop ma własną pulę autorelease.
Zasadniczo pomyśl o tym w ten sposób:
while(1)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[someObject doSomething];
[pool drain];
}