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に変換したい
主題は、「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
であり、必要に応じてオブジェクトを追加または削除できます。
このコードは例外b/cを与えますNSMutableArrayをNSArrayに変換します
veryはありそうもない。 NSMutableArrayはNSArrayの派生クラスであるため、その方向でのコピーは問題になりません。
配列を保持していないためにエラーが発生した可能性があります。 arrayWithArray
はautorelease
オブジェクトを返します。 [tempPeoples copy]
または[[NSArray alloc] initWithArray: tempPeoples];
を使用します
単にあなたはそれを行うことができます
NSArray *yourArray ; // Static Array
NSMutableArray* subArrayData = [yourArray mutableCopy];