2009-09-30 8 views
6

W obiekcie mojej klasy zdefiniowałem właściwość (nonatomic, retain) dla UIImage. I przypisany tej właściwości z obrazem ładowane za pośrednictwemZwolnij zatrzymującą właściwość UIImage załadowaną przez imageNamed?

[UIImage imageNamed:@"file.png"]; 

Jeśli w pewnym momencie chcę przypisać tę właściwość do innego obrazu, należy muszę zwolnić uprzedniego odniesienia?

Jestem zdezorientowany, ponieważ przez zatrzymanie nieruchomości wiem, że powinienem ją zwolnić. Ale ponieważ metoda imageNamed: jest wygodna (nie używa przydziału), nie jestem pewien, którą regułę zastosować tutaj.

Dzięki za wgląd!

Odpowiedz

2

Zdjęcie zostanie zwrócone autouzupełnianiu zgodnie z zasadami nazewnictwa. Przypisanie go do właściwości z atrybutem zatrzymania za pomocą ustawiacza zachowuje ją. Przypisanie innego obrazu do nieruchomości za pomocą settera spowoduje zwolnienie starego obrazu i zachowanie nowego.

0

Z docs:

... jeśli masz zamiar trzymać zwróconego obiektu obrazu, należy zachować je jak każdy obiekt kakao.

Implikacją jest to, że jeśli nie chcesz już go trzymać, powinieneś go zwolnić (zakładając, że go zachowałeś).

1

Po zdefiniowaniu nieruchomość nonatomic & retain, tworzy setter dla ciebie, że wygląda tak:

-(void)setImage:(UIImage*)newImage { 
    if (image != newImage) { 
    [image release]; 
    image = [newImage retain]; 
    } 
} 

Jak widać, to zwolni poprzednią wartość przed zachowując nową wartość.

W tym szczególnym przypadku autoodtwarzany obraz zwrócony przez -[UIImage imageNamed:] zostanie automatycznie zachowany po przypisaniu go do właściwości, a następnie automatycznie zwolniony po przypisaniu do niego innego obrazu (lub nil).

0

Należy zwolnić wszystkie obiekty jesteś oporowe, jednak podczas definiowania swój przedmiot obrazu, wierzę Twój kod powinien wyglądać tak:

UIImage *img = [[UIImage imageNamed:@"file.png"] retain]; 
6

Prawidłowe Florin ... ale za powyższej dyskusji , jeśli używasz settera dla właściwości, która (albo poprzez syntezę, albo ręcznie) robi "zachowaj", to nie ma potrzeby dodatkowego zachowania.

Innymi słowy, poniższe byłoby poprawne (i wolne od wycieków pamięci), IMHO, mam rację? Myślę, że to była pierwotna intencja pytania ... i chciałbym też być pewien. ;-) dzięki!

@interface MyClass { 
    UIImage *myImage; 
} 
@property (nonatomic, retain) UIImage *myImage; 
@end 

@implementation MyClass 
@synthesize myImage; 

- (void) someMethod { 

    self.myImage = [UIImage imageNamed:@"foo.png"]; 
} 

- (void) someOtherMethod { 

    self.myImage = [UIImage imageNamed:@"bar.png"]; 
} 

- (void) dealloc { 

    self.myImage = nil; 
    [super dealloc]; 
} 
@end 
+0

To się zgadza. użycie 'self.myImage = someImage' wywołuje metodę ustawiającą, która zachowuje ją dla ciebie. AND '[UIImage imageNamed:]' zwraca autoodtwarzany obraz, co oznacza, że ​​nie musisz po nim sprzątać. –

Powiązane problemy