Как конвертировать NSArray в NSMutableArray - PullRequest
20 голосов
/ 31 декабря 2010
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 ]

40 голосов
/ 31 декабря 2010

Тема читает: «Как конвертировать NSArray в NSMutableArray». Чтобы получить NSMutableArray из NSArray, используйте метод класса в NSMutableArray + arrayWithArray :.

Ваш код не показывает декларацию для людей. Предполагая, что он объявлен как NSMutableArray, вы можете столкнуться с проблемами, если попытаетесь обработать его как таковой. Когда вы отправляете сообщение копирования на NSMutableArray, вы получаете неизменный объект NSArray, поэтому, если вы попытаетесь добавить объект к скопированному NSMutableArray, вы получите ошибку.

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, готовым для добавления или удаления объектов по мере необходимости.

4 голосов
/ 31 декабря 2010

Этот код дает исключение b / c. Я хочу преобразовать NSMutableArray в NSArray

Это очень маловероятно. NSMutableArray является производным классом NSArray, поэтому копирование в этом направлении не является проблемой.

Возможно, у вас ошибка, потому что вы не сохраняете массив. arrayWithArray возвращает объект autorelease. Либо используйте [tempPeoples copy] или [[NSArray alloc] initWithArray: tempPeoples];

1 голос
/ 27 ноября 2017

Просто вы можете сделать это

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