Objective c 可变数组在向其添加对象时自动更改为不可变数组。为什么?

Objective c 可变数组在向其添加对象时自动更改为不可变数组。为什么?,objective-c,copy,nsmutablearray,memory-leaks,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];

这些是二传手和传手

-(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];
在这里,我得到了变异的例外

对象设置为不可变,但它仅是可变的


如果我删除复制,它工作正常,但我正在泄漏,因此我想毫无例外地将该对象添加到列表中,它不会产生任何泄漏。

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

而不是

 [contactList release]; contactList=aContactList;
尝试重新引用旧引用

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

关于

您可以尝试
-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];
}

首先,您并没有获得传递给setter的参数的所有权。此外,您还需要复制可变实例,以避免它们在您的管理下被更改

使用例如:

- (void)setContactList:(NSMutableArray *)aContactList {
    NSMutableArray *tmp = contactList;
    contactList = [aContactList mutableCopy];
    [tmp release];
}
但是,为什么不使用声明的属性呢

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

// implementation:
@synthesize contactList;