2009-09-30 8 views
6

In meinem Klassenobjekt habe ich eine (nonatomic, retain) -Eigenschaft für UIImage definiert. I zugewiesen diese Eigenschaft mit einem Bild überFreigabe einer retain UIImage-Eigenschaft, die über imageNamed geladen wurde?

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

Wenn ich irgendwann diese Eigenschaft auf ein anderes Bild neu zuweisen möchten, sollte ich die vorherige Referenz zu lösen haben?

Ich bin verwirrt, weil durch die Retain-Eigenschaft ich weiß, ich sollte es freigeben. Aber weil imageNamed: eine Bequemlichkeitsmethode ist (verwendet nicht alloc), bin ich nicht sicher, welche Regel hier anzuwenden ist.

Danke für die Einsicht!

Antwort

2

Das Bild wird Ihnen gemäß den Benennungsregeln wieder freigegeben. Wenn Sie es einer Eigenschaft mit einem Retain-Attribut über den Setter zuweisen, wird es beibehalten. Wenn Sie der Eigenschaft über den Setter ein anderes Bild zuweisen, wird das alte Bild freigegeben und das neue beibehalten.

0

Vom docs:

... wenn Sie auf ein Bild zurück Objekt zu halten, müssen Sie es, wie Sie behalten würde jedes Cocoa-Objekt.

Die Implikation ist, dass wenn Sie nicht mehr daran festhalten wollen, sollten Sie es freigeben (vorausgesetzt, Sie haben es beibehalten).

1

Wenn Sie eine Eigenschaft mit nonatomic & retain definieren, erstellt es einen Setter für Sie, dass wie folgt aussieht:

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

Wie Sie sehen können, ist es den vorherigen Wert freigibt, bevor Sie den neuen Wert zu halten. In Ihrem speziellen Fall wird das von -[UIImage imageNamed:] zurückgegebene Bild automatisch beibehalten, wenn Sie es der Eigenschaft zuweisen. Anschließend wird es automatisch freigegeben, wenn Sie der Eigenschaft ein anderes Bild (oder nil) zuweisen.

0

sollten Sie geben alle Objekte Sie zu halten, aber wenn Sie Ihr Bildobjekt definieren, glaube ich, Ihr Code sollte wie folgt aussehen:

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

Korrekt, Florin ... aber je die Diskussion über Wenn man einen Setter für die Eigenschaft verwendet, die (entweder über Synthetisieren oder manuell) das "Zurückbehalten" ausführt, dann ist keine zusätzliche Speicherung erforderlich.

Mit anderen Worten, das folgende wäre korrekt (und frei von Speicherlecks), IMHO, bin ich richtig? Ich denke, das war die ursprüngliche Absicht der Frage ... und ich möchte auch sicher sein. ;-) Danke!

@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

Dies ist korrekt. using 'self.myImage = someImage' ruft die Setter-Methode auf, die sie für Sie speichert. UND '[UIImage imageNamed:]' gibt ein automatisch freigegebenes Bild zurück, was bedeutet, dass Sie danach nicht mehr aufräumen müssen. –