2010-12-31 14 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]; 

Ten kod daje wyjątek b/c chcę przekonwertować NSMutableArray do NSArray proszę o pomocJak przekonwertować NSArray do NSMutableArray

+2

tu odpowiedzi http://stackoverflow.com/questions/3222122/converting-nsarray-to-nsmutablearray – Mantar

Odpowiedz

40

Temat brzmi: „Jak przekonwertować NSArray do NSMutableArray”. Aby uzyskać numer NSMutableArray od NSArray, użyj metody klasy pod adresem NSMutableArray + arrayWithArray:.

Twój kod nie zawiera deklaracji narodów. Zakładając, że jest zadeklarowany jako NSMutableArray, możesz napotkać problemy, jeśli spróbujesz traktować je jako takie. Po wysłaniu wiadomości do kopiowania do NSMutableArray otrzymasz niezmienny obiekt, NSArray, więc jeśli spróbujesz dodać obiekt do skopiowanego NSMutableArray, otrzymasz błąd.

CFArrayRef jest wolny przejazd mostem NSArray, więc można uprościć kod w ten sposób:

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 

W powyższych tempPeoples kod jest autoreleased NSMutableArray gotowy, aby dodać lub usunąć obiekty, ile potrzeba.

4

Ten kod daje wyjątek b/c chcę przekonwertować NSMutableArray do NSArray

To jest bardzo mało prawdopodobne. NSMutableArray jest pochodną klasą NSArray, więc kopiowanie w tym kierunku nie stanowi problemu.

Może masz błąd, ponieważ nie przechowujesz tablicy. arrayWithArray zwraca obiekt autorelease. Użyć [tempPeoples copy] lub [[NSArray alloc] initWithArray: tempPeoples];

+0

ja, ale to znowu daje następujący wyjątek: 2010- 12-31 15: 30: 24.889 Mianowanie [2708: 207] *** Kończenie aplikacji z powodu niezatapianego wyjątku "NSInvalidArgumentException", powód: "*** - [NSCFType isEqualToString:]: nierozpoznany selektor wysłany do instancji 0x420f900 ' 2010- 12-31 15: 30: 24,890 Nominacja [2708: 207] Stos: ( 30393435, 2510714121, 30775355, 30344822, 30197442, 4347985, 9508, 9508, 3018252, – Ali

+0

Cóż, nie widzę linii powodującej wyjątek w kodzie, który pokazałeś, nie mogę ci tam pomóc. Gdzie nazywasz "isEqualToString"? – jv42

0

prostu można zrobić

NSArray *yourArray ; // Static Array 
NSMutableArray* subArrayData = [yourArray mutableCopy]; 
Powiązane problemy