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

xon*_*rlz 0 cocoa-touch memory-management properties objective-c

我定义了以下属性:

@property (nonatomic, retain) NSString *name_;
@property (nonatomic, retain) NSString *profilePicture_;
@property (nonatomic, retain) NSString *username_;
@property (nonatomic, retain) NSString *id_;
Run Code Online (Sandbox Code Playgroud)

我把它们设置在我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;
}
Run Code Online (Sandbox Code Playgroud)

以下内容dealloc:

-(void)dealloc
{
    [name_ release];
    [username_ release];
    [profilePicture_ release];
    [id_ release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

但是dealloc给了我一个错误:

正在释放的指针未分配

为什么是这样?我必须做的[[NSString alloc] init...]还是[NSString stringWithString:]

Pau*_*l.s 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];
Run Code Online (Sandbox Code Playgroud)

您还应该更改@property要使用的声明,copy因为这通常建议用于字符串.

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