在我的班级对象中,我为(nonatomic, retain)
定义了UIImage
属性。
我为此属性分配了通过
[UIImage imageNamed:@"file.png"];
如果在某些时候我想将此属性重新分配给另一个图像,我是否必须释放先前的参考?
我很困惑,因为我知道我应该释放它的retain属性。
但是因为imageNamed:
是一种方便的方法(不使用alloc),我不确定在这里应用什么规则。
感谢您的见解!
答案 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)
答案 4 :(得分:0)
您应该释放您保留的所有对象,但是在定义图像对象时,我相信您的代码应如下所示:
UIImage *img = [[UIImage imageNamed:@"file.png"] retain];