在dealloc中释放ivars会释放"释放的指针未被分配"错误

时间:2012-04-28 16:12:12

标签: objective-c cocoa-touch memory-management properties

我定义了以下属性:

@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:]吗?

3 个答案:

答案 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,因为这通常建议用于字符串。

另一种选择是通过合成访问器但我通常避免在initdealloc

中执行此操作

答案 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确定过度释放对象的位置。