释放通过imageNamed加载的保留UIImage属性?

时间:2009-09-30 18:14:23

标签: iphone uiimage release retain

在我的班级对象中,我为(nonatomic, retain)定义了UIImage属性。 我为此属性分配了通过

加载的图像
[UIImage imageNamed:@"file.png"];

如果在某些时候我想将此属性重新分配给另一个图像,我是否必须释放先前的参考?

我很困惑,因为我知道我应该释放它的retain属性。 但是因为imageNamed:是一种方便的方法(不使用alloc),我不确定在这里应用什么规则。

感谢您的见解!

5 个答案:

答案 0 :(得分:6)

正确,弗罗林......但根据上面的讨论,如果一个人使用一个setter作为属性(通过合成或手动)执行“保留”,那么就不需要额外的保留。

换句话说,以下是正确的(并且没有内存泄漏),恕我直言,我是对的吗?我认为这是问题的初衷......我也想确定。 ;-) thx!

@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

答案 1 :(得分:2)

根据命名规则将图像返回给您自动释放。通过setter将其分配给具有retain属性的属性将保留它。通过setter将另一个图像分配给属性将释放旧图像并保留新图像。

答案 2 :(得分:1)

使用nonatomic&定义属性时retain,它会为您创建一个看起来像这样的setter:

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

如您所见,它会在保留新值之前释放先前的值。

在您的特定情况下,-[UIImage imageNamed:]返回的自动释放图像会在您将其分配给属性时自动保留,然后在您将另一个图像(或nil)分配给该属性时自动释放

答案 3 :(得分:0)

来自docs

  

...如果您打算保留一个返回的图像对象,则必须像保存任何Cocoa对象一样保留它。

这意味着如果你不想再坚持它,你应该释放它(假设你保留了它)。

答案 4 :(得分:0)

您应该释放您保留的所有对象,但是在定义图像对象时,我相信您的代码应如下所示:

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