我的项目中有这个类:
@interface VideoItem : NSObject <NSCoding> {
NSString *name;
NSString *artist;
int seconds;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *imgUrl;
@property (nonatomic, retain) NSString *artist;
@end
这就是我创建这个对象的方式:
VideoItem *item = [[VideoItem alloc] init];
item.name = name;
item.imgUrl = imgLink;
item.artist = artist;
这就是dealloc:
- (void)dealloc{
[name release];
[imgUrl release];
[artist release];
[super dealloc];
}
我想知道这dealoc
对NON-ARC
是否合适?我是否需要做其他事情因为NSString
属于Property?
如果VideoItem对象是使用:
创建的VideoItem *item = [[VideoItem alloc] init];
item.name = [NSString alloc]initWithFormat@"%@",name];
item.imgUrl = [NSString alloc]initWithFormat@"%@",imgLink];
item.artist = [NSString alloc]initWithFormat@"%@",artist];
在这种情况下,dealloc仍然可以吗?或者我需要改变什么?
答案 0 :(得分:2)
一切看起来都不错,你正在释放你对象的所有@properties
。我可能会将它们指向nil,只是为了确保,如果调用其中一个属性,它将被填充并且没有垃圾值,如下所示:
- (void)dealloc{
[name release], name = nil;
[imgUrl release], imgUrl = nil;
[artist release], artist = nil;
[super dealloc];
}
另一件事,没有相关性,如果您要创建自己的init,那么它会更干净,因此您可以在实际创建对象时传递属性值,如下所示:
-initWithName:(NSString *)name withImgURL:(NSString *)imgURL withArtist:(NSString *)artist;
您的修改:
item.name = [NSString alloc]initWithFormat@"%@",name];
item.imgUrl = [NSString alloc]initWithFormat@"%@",imgLink];
item.artist = [NSString alloc]initWithFormat@"%@",artist];
仅基于此,它会造成泄漏,所以你应该小心。解决这个问题:
item.name = [[NSString alloc]initWithFormat@"%@",name] autorelease];
item.imgUrl = [[NSString alloc]initWithFormat@"%@",imgLink] autorelease];
item.artist = [[NSString alloc]initWithFormat@"%@",artist] autorelease];
答案 1 :(得分:0)
如果您没有启用ARC,那么析构函数是正确的。您将释放所有保留并调用super的属性,这就是您所需要的。