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;