重新分配时的内存处理

时间:2011-03-11 15:36:23

标签: iphone objective-c memory-leaks

内存管理如何适用于例如一个重新分配给另一个图像的UIImage。

e.g。

someImage = image1.png

someImage = image2.png

在内存方面,image1.png会发生什么?重新分配会有泄漏吗?

图像将从文档目录中加载。

3 个答案:

答案 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方法,否则什么都不会惹人注意。