web-dev-qa-db-fra.com

Comment convertir NSArray en NSMutableArray

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];

Ce code donne une exception car je veux convertir NSMutableArray en NSArray Please Help

20
Ali

Le sujet se lit "Comment convertir NSArray en NSMutableArray". Pour obtenir un NSMutableArray à partir d'un NSArray, utilisez la méthode de classe sur NSMutableArray + arrayWithArray :. 

Votre code ne montre pas la déclaration pour les peuples. En supposant qu'il soit déclaré comme NSMutableArray, vous pouvez rencontrer des problèmes si vous essayez de le traiter comme tel. Lorsque vous envoyez le message de copie à un NSMutableArray, vous obtenez un objet immuable, NSArray. Par conséquent, si vous essayez d'ajouter un objet à un NSMutableArray copié, vous obtenez une erreur.

CFArrayRef est ponté sans frais vers NSArray, vous pouvez donc simplifier votre code de la manière suivante:

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

Dans le code ci-dessus, tempPeoples est un NSMutableArray autoreleased qui vous permet d'ajouter ou de supprimer des objets selon vos besoins.

40
sean woodward

Ce code donne une exception car je veux convertir NSMutableArray en NSArray.

C'est très peu probable. NSMutableArray est une classe dérivée de NSArray, la copie dans cette direction n'est donc pas un problème.

Peut-être que vous avez une erreur parce que vous ne conservez pas le tableau. arrayWithArray renvoie un objet autorelease. Utilisez soit [tempPeoples copy] ou [[NSArray alloc] initWithArray: tempPeoples];

4
jv42

Simplement tu peux le faire

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