Dealloc的自定义对象

时间:2013-05-13 08:27:47

标签: iphone ios objective-c

我的项目中有这个类:

        @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];
}

我想知道这dealocNON-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仍然可以吗?或者我需要改变什么?

2 个答案:

答案 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的属性,这就是您所需要的。