0

我定义了以下属性:

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

4

3 回答 3

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

于 2012-04-28T16:15:59.643 回答
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],这最终导致了您描述的问题。

于 2012-04-28T16:15:08.140 回答
0

由于您使用的是字典中的数据,因此您应该使用 self 关键字通过属性设置值。

如果它没有解决,那么问题可能不在你的类中,而可能在你创建它的实例的地方。尝试检查您分配和释放此类实例的代码。

您还应该使用 Simulator & NSZombies 分析您的应用程序 n 确定您过度释放对象的位置。

于 2012-05-07T11:40:38.673 回答