在我的类对象中,我(nonatomic, retain)
为UIImage
. 我为这个属性分配了一个通过加载的图像
[UIImage imageNamed:@"file.png"];
如果在某个时候我想将此属性重新分配给另一个图像,我是否必须释放先前的参考?
我很困惑,因为我知道我应该通过保留属性释放它。但是因为imageNamed:
是一种方便的方法(不使用 alloc),我不确定在这里应用什么规则。
感谢您的洞察力!
正确,弗洛林......但根据上面的讨论,如果一个人正在使用一个设置器来(通过合成或手动)执行“保留”的属性,那么就不需要额外的保留。
换句话说,以下是正确的(并且没有内存泄漏),恕我直言,对吗?我认为这是问题的初衷......我也想确定。;-) 谢谢!
@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
图像会根据命名规则自动发布给您。通过设置器将其分配给具有保留属性的属性将保留它。通过 setter 将另一个图像分配给属性将释放旧图像并保留新图像。
当您使用nonatomic
&定义属性时retain
,它会为您创建一个如下所示的 setter:
-(void)setImage:(UIImage*)newImage {
if (image != newImage) {
[image release];
image = [newImage retain];
}
}
如您所见,它在保留新值之前释放了先前的值。
在您的特定情况下,返回的自动释放图像-[UIImage imageNamed:]
将在您将其分配给属性时自动保留,然后在您将另一个图像(或nil
)分配给属性时自动释放。
您应该释放您保留的所有对象,但是当您定义图像对象时,我相信您的代码应该如下所示:
UIImage *img = [[UIImage imageNamed:@"file.png"] retain];