web-dev-qa-db-ja.com

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

このコードは例外b/cを与えますNSMutableArrayをNSArrayに変換したい

20
Ali

主題は、「NSArrayNSMutableArrayに変換する方法」を読みます。 NSMutableArrayからNSArrayを取得するには、NSMutableArray + arrayWithArray:のクラスメソッドを使用します。

あなたのコードは人々のための宣言を示していません。 NSMutableArrayとして宣言されていると仮定すると、そのように処理しようとすると問題が発生する可能性があります。 NSMutableArrayにコピーメッセージを送信すると、不変オブジェクトNSArrayが取得されるため、コピーされたNSMutableArrayにオブジェクトを追加しようとすると、エラー。

CFArrayRefNSArrayにフリーブリッジされているため、次のようにコードを簡略化できます。

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であり、必要に応じてオブジェクトを追加または削除できます。

40
sean woodward

このコードは例外b/cを与えますNSMutableArrayをNSArrayに変換します

veryはありそうもない。 NSMutableArrayはNSArrayの派生クラスであるため、その方向でのコピーは問題になりません。

配列を保持していないためにエラーが発生した可能性があります。 arrayWithArrayautoreleaseオブジェクトを返します。 [tempPeoples copy]または[[NSArray alloc] initWithArray: tempPeoples];を使用します

4
jv42

単にあなたはそれを行うことができます

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