2010-12-31 11 views
19
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]; 

Este código da excepción b/c Quiero convertir NSMutableArray a NSArray favor ayudaCómo convertir NSArray a NSMutableArray

+2

respondida aquí http://stackoverflow.com/questions/3222122/converting-nsarray-to-nsmutablearray – Mantar

Respuesta

40

El asunto dice "Cómo convertir NSArray en NSMutableArray". Para obtener un NSMutableArray de NSArray, use el método de clase en NSMutableArray + arrayWithArray:.

Su código no muestra la declaración para los pueblos. Suponiendo que se declare como NSMutableArray, puede tener problemas si intenta tratarlo como tal. Cuando envía el mensaje de copia a NSMutableArray, obtiene un objeto inmutable, NSArray, por lo que si intenta agregar un objeto a un NSMutableArray copiado, obtendrá un error.

CFArrayRef está al teléfono gratuito puenteados a NSArray, por lo que podría simplificar el código de esta manera:

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 

En los tempPeoples código anterior es un NSMutableArray autoreleased listo para agregar o quitar objetos según sea necesario.

4

Este código da excepción b/c Quiero convertir NSMutableArray a NSArray

Esto es muy poco probable. NSMutableArray es una clase derivada de NSArray, por lo que copiar en esa dirección no es un problema.

Quizás haya un error porque no conserva la matriz. arrayWithArray devuelve un objeto autorelease. Utilice [tempPeoples copy] o [[NSArray alloc] initWithArray: tempPeoples];

+0

lo hice, pero es de nuevo dando siguiente excepción: 2010- 12-31 15: 30: 24.889 Cita [2708: 207] *** Aplicación de finalización debido a la excepción no detectada 'NSInvalidArgumentException', razón: '*** - [NSCFType isEqualToString:]: selector no reconocido enviado a la instancia 0x420f900' 2010- 12-31 15: 30: 24.890 Nombramiento [2708: 207] Pila: ( 30393435, 2510714121, 30775355, 30344822, 30197442, 4347985, 9508, 3018252, – Ali

+0

Bueno, no veo la línea que causa la excepción en el código que ha mostrado, no puedo ayudarlo allí. ¿A dónde llamas 'isEqualToString'? – jv42

0

Simplemente se puede hacer eso

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