可变数组自动更改为不可变,同时将对象添加到它。为什么?

时间:2010-06-30 06:15:46

标签: objective-c copy nsmutablearray memory-leaks

这些是制定者和吸气者。

-(NSMutableArray*)contactList
{
    return contactList;
}
-(void)setContactList:(NSMutableArray*) aContactList
{
    [contactList release];
    contactList=aContactList; //its working fine but leaks 
    // contactList=[aContactList copy]; 
    //   If I keep like this getting exception as mutating 
    //   object setting to immutable but it is mutable only. 
}

在视图控制器中,在编辑功能中,我将新对象添加到列表中,如此

[tempDetailsObj.contactList addObject:editcontacts];

这里我变异异常

对象设置为不可变但仅可变。

如果我删除复制它的工作正常但我得到泄漏,所以我想将该对象添加到列表中,没有任何异常,它不会产生任何泄漏。

3 个答案:

答案 0 :(得分:1)

您可以尝试-mutableCopy或仅使用-removeAllObjects已有的参考:

-(NSMutableArray*)contactList
{
    return contactList;
}
-(void)setContactList:(NSMutableArray*) aContactList
{
    //   Either this way:
    [contactList removeAllObjects];
    [contactList addObjectsFromArray:aContactList];
    //   Or this way:
    [contactList release];
    contactList = [aContactList mutableCopy];
}

答案 1 :(得分:1)

对于初学者,您没有获得传递给您的setter的参数的所有权。此外,您还需要复制可变实例,以避免在您之下更改它们。

使用例如这样:

- (void)setContactList:(NSMutableArray *)aContactList {
    NSMutableArray *tmp = contactList;
    contactList = [aContactList mutableCopy];
    [tmp release];
}

但是,为什么不使用声明的属性:

// interface:
@property (nonatomic, copy) NSMutableArray *contactList;

// implementation:
@synthesize contactList;

答案 2 :(得分:0)

我不知道它是否解决了问题,但请尝试以下

而不是

 [contactList release]; contactList=aContactList;

尝试回收旧的参考资料

[contactList removeAllObjects]; [contactList addObjectsFromArray:aContactList];

问候