如何将NSArray转换为NSMutableArray

时间:2010-12-31 10:14:17

标签: objective-c nsmutablearray nsarray

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);  
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

NSMutableArray *tempPeoples=[[NSMutableArray alloc]init];

for(int i=0;i<nPeople;i++){

    ABRecordRef i1=CFArrayGetValueAtIndex(allPeople, i);
    [tempPeoples addObject:i1];

//  [peoples addObject:i1];

}// end of the for loop
peoples=[tempPeoples copy];

此代码提供异常b / c我想将NSMutableArray转换为NSArray 请帮忙

3 个答案:

答案 0 :(得分:40)

主题为“如何将NSArray转换为NSMutableArray”。要从NSMutableArray获取NSArray,请使用NSMutableArray + arrayWithArray:上的类方法。

您的代码不会显示人们的声明。假设它被声明为NSMutableArray,如果您尝试将其视为此问题,则可能会遇到问题。当您将复制邮件发送到NSMutableArray时,您将获得一个不可变对象NSArray,因此,如果您尝试将对象添加到复制的NSMutableArray,则会收到错误。< / p>

CFArrayRef免费桥接到NSArray,因此您可以通过这种方式简化代码:

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
//NSMutableArray *tempPeoples = [NSMutableArray arrayWithArray:(NSArray*)allPeople];
// even better use the NSMutableCopying protocol on NSArray
NSMutableArray *tempPeoples = [(NSArray*)allPeople mutableCopy];
CFRelease(allPeople);
return tempPeoples; // or whatever is appropriate to your code

在上面的代码中,tempPeoples是一个自动释放的NSMutableArray,可以根据需要添加或删除对象。

答案 1 :(得分:4)

  

此代码提供异常b / c我想将NSMutableArray转换为NSArray

非常不太可能。 NSMutableArray是NSArray的派生类,因此在这个方向上复制不是问题。

也许你有一个错误,因为你没有保留数组。 arrayWithArray会返回autorelease个对象。使用[tempPeoples copy][[NSArray alloc] initWithArray: tempPeoples];

答案 2 :(得分:0)

只需你可以做到

NSArray *yourArray ; // Static Array
NSMutableArray* subArrayData = [yourArray mutableCopy];