我的项目中有这个类的标题:
@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
方法并释放字符串吗?
答案 0 :(得分:1)
使用ARC并忘记与内存管理相关的任何问题。 即使苹果鼓励尽可能使用ARC。如果您将此作为新开发,我建议您使用ARC。
如果您不想使用ARC,则需要实现dealloc并释放您的成员变量。
答案 1 :(得分: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约定应该以{{1}}开头,以使它们更加明显,它们不是属性。
答案 2 :(得分:0)
您保留了字符串属性。 所以发布它是你的任务。
所以添加dealloc
方法并释放它们。
- (void)dealloc
{
[idStr release];
[name release];
[link release];
[super dealloc];
}
答案 3 :(得分:0)
使用此方法,释放所有已分配的变量,最后调用super dealloc:
- (void)dealloc{
[idStr release];
[name release];
[link release];
[super dealloc];
}
答案 4 :(得分:0)
答案 5 :(得分:-1)
事实上,您无需在ivars上调用该版本。而是使用属性 self.ivar =零。这会释放你的内存并将指针设置为nil,因为它没有悬空指针。
如果你使用[ivar release],ivar被释放但是是一个悬垂的指针,所以大多数时候ivar = nil;在释放伊娃之后完成。
- (void)dealloc
{
self.idStr = nil;
self.name = nil;
self.link = nil;
[super dealloc];
}