0

我的项目中有这个类的标题:

    @interface VideoItem : NSObject <NSCoding> {
        NSString *idStr;
        NSString *name;
        NSString *link;
    }

    -(id)initWithVideoItem:(VideoItem*)video;

    @property (nonatomic, retain) NSString *name;
    @property (nonatomic, retain) NSString *link;
    @property (nonatomic, retain) NSString *idStr;

    @end

这是工具:

@implementation VideoItem
@synthesize name,link,idStr;

-(id)initWithVideoItem:(VideoItem*)video{
    if (self = [super init]) {
        self.name = video.name;
        self.link = video.link;
        self.idStr = video.idStr;
    }
    return self;
}

#pragma mark 
#pragma mark NSCoder

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.name forKey:@"video_name"];
    [encoder encodeObject:self.link forKey:@"video_link"];  
    [encoder encodeObject:self.idStr forKey:@"video_id"];   
    [encoder encodeObject:self.imgUrl forKey:@"video_img"];
    [encoder encodeObject:self.viewCount forKey:@"video_views"];
    [encoder encodeObject:self.artist forKey:@"video_artist"];
    [encoder encodeObject:self.timeStr forKey:@"video_timestr"];    
    [encoder encodeInt:self.seconds forKey:@"video_secondes"];
    [encoder encodeInt:self.rating forKey:@"video_rating"];
    [encoder encodeObject:self.pubDate forKey:@"pubDate"];

}

- (id)initWithCoder:(NSCoder *)decoder {
    if(self = [super init]){
        self.name = [decoder decodeObjectForKey:@"video_name"];
        self.link = [decoder decodeObjectForKey:@"video_link"]; 
        self.idStr = [decoder decodeObjectForKey:@"video_id"];
    }
    return self;
}

@end

我想知道在这种情况下我是否需要添加dealloc方法并释放字符串?

4

6 回答 6

1

使用 ARC 并忘记与内存管理相关的任何问题。甚至苹果也鼓励尽可能使用 ARC。如果您将此作为一项新开发,我建议您使用 ARC。

如果您不想使用 ARC,则需要实现 dealloc 并释放您的成员变量。

于 2013-01-17T08:53:39.203 回答
1

是的,您应该释放字符串,因为在使用保留对象的属性时。

- (void)dealloc {
   [idStr release];
   [name release];
   [link release];
   [super dealloc];
}

通常你会在 init 中复制对象,这是一种更好的方法,因为原始对象可以被保存地编辑或释放。

-(id)initWithVideoItem:(VideoItem*)video{
    if ((self = [super init])) {
        name = [video.name copy];
        link = [video.link copy];
        idStr = [video.idStr copy];
    }
    return self;
}

由于该copy方法返回一个保留对象,因此您希望跳过该属性,因为这会增加保留计数。

另一方面:私有ivar的objective-c约定应该以an开头,_以使其更明显地表明它们不是属性。

于 2013-01-17T08:54:12.370 回答
0

您必须编写 - (void)dealloc 方法,因为您要保留变量。并在此方法中释放这些变量。

于 2013-01-17T09:02:48.107 回答
0

使用它,释放所有分配的变量,最后调用 super dealloc :

- (void)dealloc{
   [idStr release];
   [name release];
   [link release];
   [super dealloc];
}
于 2013-01-17T08:55:26.557 回答
0

您正在保留您的字符串属性。所以释放它是你的任务。

所以添加一个dealloc方法并释放它们。

- (void)dealloc
{
   [idStr release];
   [name release];
   [link release];
   [super dealloc];
}
于 2013-01-17T08:53:46.417 回答
-1

事实上,你不需要调用 ivars 上的发布。而是使用属性 self.ivar = nil。这会释放您的内存并将指针设置为 nil,因为没有悬空指针。

如果你使用 [ivar release],ivar 会被释放,但它是一个悬空指针,所以大多数时候 ivar = nil; 在释放 ivar 后完成。

- (void)dealloc
{
   self.idStr = nil;
   self.name = nil;
   self.link = nil;

   [super dealloc];
}    
于 2013-01-17T10:31:49.500 回答