2009-09-30 12 views
6

Nella classe oggetto ho definito una proprietà (nonatomic, retain) per UIImage. ho assegnato l'immobile su un'immagine caricata tramiteRilasciare una proprietà UIImage di mantenimento caricata tramite imageNamed?

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

Se ad un certo punto che voglio riassegnare questa proprietà ad un'altra immagine, dovrei avere per rilasciare il riferimento prima?

Sono confuso perché dalla proprietà retain so che dovrei rilasciarlo. Ma poiché imageNamed: è un metodo di convenienza (non utilizza l'allocazione), non sono sicuro quale regola applicare qui.

Grazie per l'intuizione!

risposta

2

L'immagine viene restituita automaticamente in base alle regole di denominazione. Assegnarlo a una proprietà con un attributo di mantenimento tramite il setter lo manterrà. Assegnando un'altra immagine alla proprietà tramite il setter verrà rilasciata la vecchia immagine e conserverà quella nuova.

0

Dal docs:

... se avete intenzione di tenere su un oggetto immagine restituito, è necessario conservarlo come si farebbe con qualsiasi oggetto di cacao.

L'implicazione è che se non vuoi più tenerlo premuto, dovresti rilasciarlo (presumendo che tu l'abbia trattenuto).

1

Quando si definisce una proprietà con nonatomic & retain, si crea un setter per voi che assomiglia a questo:

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

Come si può vedere, rilascia il valore precedente prima mantenendo il nuovo valore.

Nel tuo caso particolare, l'immagine autorizzata restituita da -[UIImage imageNamed:] verrà automaticamente mantenuta quando la si assegna alla proprietà, e quindi automaticamente rilasciata quando si assegna un'altra immagine (o nil) alla proprietà.

0

Si dovrebbe rilasciare tutti gli oggetti che stai sostegno, tuttavia quando si definisce l'oggetto immagine, credo che il codice dovrebbe essere simile a questo:

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

corretta, Florin ... ma per la discussione di cui sopra , se si sta usando un setter per la proprietà che (sia via sintetizza, o manualmente) fa il "conservare", quindi non c'è bisogno di ritenzione extra.

In altre parole, il seguente sarebbe corretto (e privo di perdite di memoria), IMHO, ho ragione? Penso che questo fosse l'intento originale della domanda ... e mi piacerebbe anche essere sicuro. ;-) grazie!

@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

Questo è corretto. usando 'self.myImage = someImage' chiama il metodo setter, che lo mantiene per te. AND '[UIImage imageNamed:]' restituisce un'immagine autorizzata, il che significa che non devi pulire dopo. –

Problemi correlati