内存管理如何适用于例如一个重新分配给另一个图像的UIImage。
e.g。
someImage = image1.png
someImage = image2.png
在内存方面,image1.png会发生什么?重新分配会有泄漏吗?
图像将从文档目录中加载。
答案 0 :(得分:1)
这取决于您如何加载图像。就像任何其他对象一样,如果你分配&自己创业然后你必须自己清理。否则,您可以依赖自动释放的对象。
这不会泄漏:
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中了。 :)
答案 1 :(得分: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];
答案 2 :(得分:0)
另一种方法是使用@property和“retain”属性集(与@synthesize一起使用)。但是当你分配它们时,你需要“释放”一个分配的对象:
@property (retain) UIImage *someImage;
...
@synthesize someImage;
...
self.someImage = givenImageg1;
...
self.someImage = givenImage2;
最后一行将释放第一个图像集,然后保留第二个图像集。请注意,您必须使用“自我”。为了确保你使用魔法的setter方法,否则什么都不会惹人注意。