7

在我的类对象中,我(nonatomic, retain)UIImage. 我为这个属性分配了一个通过加载的图像

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

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

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

感谢您的洞察力!

4

5 回答 5

6

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

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

@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
于 2010-05-26T23:47:40.143 回答
2

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

于 2009-09-30T21:19:37.670 回答
1

当您使用nonatomic&定义属性时retain,它会为您创建一个如下所示的 setter:

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

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

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

于 2009-10-01T13:31:19.700 回答
0

文档

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

这意味着如果您不再想保留它,则应该释放它(假设您已保留它)。

于 2009-09-30T18:18:58.503 回答
0

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

UIImage *img = [[UIImage imageNamed:@"file.png"] retain];
于 2010-03-22T23:46:28.640 回答