2011-03-11 82 views
-1

內存管理如何工作一個UIImage被重新分配給另一個圖像。重新分配內存處理

例如

someImage = image1.png 

someImage = image2.png 

image1.png在內存方面會發生什麼變化?重新分配會有泄漏嗎?

圖像將從文檔目錄加載。

+0

您提問的方式讓您很難理解您真正想知道的內容。這是代碼嗎?還是僞代碼?圖像不能分配給圖像。 – 2011-03-11 15:54:57

回答

1

這取決於你如何加載圖像。就像其他任何對象一樣,如果你自己分配了& init,那麼你必須清理自己。否則,你可以依靠自動釋放的對象。

這不會泄漏:

UIImage* someImage; 
someImage = [UIImage imageWithContentsOfFile:@"<path>/file1.png"]; 
// usage the image here ... 
someImage = [UIImage imageWithContentsOfFile:@"<path>/file2.png"]; 
// use the image again ... 

這將:

UIImage* someImage; 
someImage = [[UIImage alloc] initWithContentsOfFile:@"<path>/file1.png"]; 
// usage the image here … 
someImage = [[UIImage alloc] initWithContentsOfFile:@"<path>/file2.png"]; 
// use the image again ... 

這真的仍這個簡單,只要你堅持使用Cocoa類 - 你可能並不需要更多地進入Carbon API。 :)

0

這取決於您如何分配圖像。

如果你這樣做

UIImage *someImage = [[UIImage alloc] initWithContentsOfFile:@"image1.png"]; 
... 
someImage = [[UIImage alloc] initWithContentsOfFile:@"image2.png"]; 

將有內存泄漏,因爲你有過someImage所有權和你不釋放它。

做一個正確的做法是:

UIImage *someImage = [[UIImage alloc] initWithContentsOfFile:@"image1.png"]; 
... 
[someImage release]; 
someImage = [[UIImage alloc] initWithContentsOfFile:@"image2.png"]; 
... 
[someImage release]; 

,也可以使用自動釋放的對象

UIImage *someImage = [[[UIImage alloc] initWithContentsOfFile:@"image1.png"] autorelease]; 
... 
someImage = [[[UIImage alloc] initWithContentsOfFile:@"image2.png"] autorelease]; 
0

另一種方法是將@property與「retain」屬性集(與@synthesize一起使用)。不過,你需要「釋放」分配對象,當你爲它們分配:

@property (retain) UIImage *someImage; 
... 
@synthesize someImage; 
... 
self.someImage = givenImageg1; 
... 
self.someImage = givenImage2; 

最後一行將發佈第一圖像集,然後再保留第二個。請注意,你必須使用「自我」。爲了確保你使用了這個魔法的setter方法,否則什麼都不會發生。