我定义了以下属性:
@property (nonatomic, retain) NSString *name_;
@property (nonatomic, retain) NSString *profilePicture_;
@property (nonatomic, retain) NSString *username_;
@property (nonatomic, retain) NSString *id_;
我在init...
中设置了这样的内容:
-(id)initWithData:(NSDictionary *)data
{
self = [super init];
if (!self) {
return nil;
}
name_ = [data valueForKey:@"full_name"];
profilePicture_ = [data valueForKey:@"profile_picture"];
username_ = [data valueForKey:@"username"];
id_ = [data valueForKey:@"id"];
return self;
}
使用以下dealloc
:
-(void)dealloc
{
[name_ release];
[username_ release];
[profilePicture_ release];
[id_ release];
[super dealloc];
}
然而,dealloc
给了我一个错误:
释放的指针未分配
这是为什么?我必须[[NSString alloc] init...]
或[NSString stringWithString:]
吗?
答案 0 :(得分:5)
valueForKey:
将返回一个自动释放的对象,因此您没有所有权。因为它们都是字符串,所以您可以像这样调用copy
name_ = [[data valueForKey:@"full_name"] copy];
profilePicture_ = [[data valueForKey:@"profile_picture"] copy];
username_ = [[data valueForKey:@"username"] copy];
id_ = [[data valueForKey:@"id"] copy];
您还应该将@property
声明更改为使用copy
,因为这通常建议用于字符串。
另一种选择是通过合成访问器但我通常避免在init
或dealloc
答案 1 :(得分:1)
这是因为您要在initWithData
中分配支持变量。您应该使用如下重写代码:
self.name_ = [data valueForKey:@"full_name"];
self.profilePicture_ = [data valueForKey:@"profile_picture"];
self.username_ = [data valueForKey:@"username"];
self.id_ = [data valueForKey:@"id"];
这将通过属性分配值,为您调用[retain]
。现在编写代码的方式,只需将指针复制到ivars中而不调用[retain]
,这最终会导致您描述的问题。
答案 2 :(得分:0)
由于您正在使用字典中的数据,因此您应该使用self关键字通过属性设置值。
如果它没有解决,那么问题可能不在你的课程内,而是在你创建它的实例的地方。尝试检查您分配和释放此类实例的代码。
您还应该使用Simulator& amp; NSZombies n确定过度释放对象的位置。