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

Mã này mang đến cho ngoại lệ b/c tôi muốn chuyển đổi NSMutableArray để NSArray Xin vui lòng giúpLàm thế nào để chuyển đổi NSArray để NSMutableArray

+2

trả lời ở đây http://stackoverflow.com/questions/3222122/converting-nsarray-to-nsmutablearray – Mantar

Trả lời

40

Chủ đề đọc, "Cách chuyển đổiđến NSMutableArray". Để có được một số NSMutableArray từ một số NSArray, hãy sử dụng phương thức lớp trên NSMutableArray + arrayWithArray:.

Mã của bạn không hiển thị tuyên bố cho mọi người. Giả sử nó được khai báo là NSMutableArray, bạn có thể gặp vấn đề nếu bạn cố gắng xử lý nó như vậy. Khi bạn gửi tin nhắn sao chép đến NSMutableArray, bạn sẽ nhận được một đối tượng bất biến, NSArray, vì vậy nếu bạn cố gắng thêm đối tượng vào số NSMutableArray được sao chép, bạn sẽ gặp lỗi.

CFArrayRef được số điện thoại miễn phí bắc cầu để NSArray, vì vậy bạn có thể đơn giản hóa mã của bạn theo cách này:

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 

Trong tempPeoples mã trên là một autoreleased NSMutableArray sẵn sàng để bạn có thể thêm hoặc loại bỏ đối tượng khi cần thiết.

4

Mã này mang đến cho ngoại lệ b/c tôi muốn chuyển đổi NSMutableArray để NSArray

Đây là rất không. NSMutableArray là một lớp dẫn xuất của NSArray, vì vậy việc sao chép theo hướng đó không phải là một vấn đề.

Có thể bạn đã gặp lỗi vì bạn không giữ lại mảng. arrayWithArray trả về đối tượng autorelease. Hoặc sử dụng [tempPeoples copy] hoặc [[NSArray alloc] initWithArray: tempPeoples];

+0

tôi đã làm, nhưng nó một lần nữa được đưa ra ngoại lệ sau đây: 2010- 12-31 15: 30: 24.889 Cuộc hẹn [2708: 207] *** Chấm dứt ứng dụng do ngoại lệ không bị bắt buộc 'NSInvalidArgumentException', lý do: '*** - [NSCFType isEqualToString:]: bộ chọn không được nhận dạng được gửi tới ví dụ 0x420f900' 2010- 12-31 15: 30: 24.890 Cuộc hẹn [2708: 207] Ngăn xếp: ( 30393435, 2510714121, 30775355, 30344822, 30197442, 4347985, 9508, 3018252, – Ali

+0

Vâng, tôi không thấy dòng gây ra ngoại lệ trong mã bạn đã hiển thị, tôi không thể giúp bạn ở đó. Bạn gọi 'isEqualToString' ở đâu? – jv42

0

Đơn giản chỉ cần bạn có thể làm điều đó

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