2009-09-30 75 views
6

在我的課堂對象中,我爲UIImage定義了一個(nonatomic, retain)屬性。 我分配這個屬性通過發佈通過imageNamed加載的保留UIImage屬性?

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

加載圖像如果在某些時候,我想這個屬性重新分配給其他的形象,我應該釋放先前的參考?

我很困惑,因爲保留財產我知道我應該釋放它。 但是因爲imageNamed:是一個方便的方法(不使用alloc),所以我不知道在這裏應用什麼規則。

感謝您的洞察!

回答

2

圖像按照命名規則返回給您autoreleased。通過setter將它分配給帶有retain屬性的屬性將保留它。通過setter將另一個圖像分配給屬性將釋放舊圖像並保留新圖像。

0

docs

...如果你打算守住返回的圖像對象,你必須保持它就像你將任何可可對象。

這意味着如果你不再想堅持它,你應該釋放它(假設你保留了它)。

1

當你定義一個nonatomic & retain一個屬性,它創建了一個二傳手你看起來像這樣:

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

正如你所看到的,它釋放保留新值之前的前值。

在您的特定情況下,-[UIImage imageNamed:]返回的自動發佈的圖像將在您將其分配給屬性時自動保留,然後在將其他圖像(或nil)分配給屬性時自動釋放。

0

您應該釋放所有你保留的對象,然而,當你定義圖像對象,我相信你的代碼應該是這樣的:

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

正確的,林...但根據上面的討論, ,如果某人正在使用setter(通過合成或手動方式)「保留」屬性,則不需要額外保留。

換句話說,以下將是正確的(並且沒有內存泄漏),恕我直言,我是對嗎?我認爲這是問題的原意......我也想確定。 ;-) 謝謝!

@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

這是正確的。使用'self.myImage = someImage'調用setter方法,它將爲您保留它。 AND'[UIImage imageNamed:]'返回一個自動釋放的圖像,這意味着你不必在它之後清理。 –