2011-07-13 29 views
6

Tôi nhận được lỗi sau khi gỡ bỏ từ NSMutableArray tôiNSMutableArray removeObjectAtIndex

-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10 
2011-07-13 00:33:14.333 MassText[1726:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10' 

Tuy nhiên ngay trước khi tôi loại bỏ, tôi in ra mảng và chỉ số. Không phải là nil và tôi không có lý do gì để tin tại sao lỗi này lại xảy ra. Bất kỳ ý tưởng?

+0

Chỉ cần kiểm tra xem bạn có đang phân bổ và nhập chính xác NSMutableArray không ..Có vẻ như bạn đang suy ra nó như là NSArray (mà doesnt có hàm removeObjectAtIndex) – Krishnabhadra

+0

nó là một NSMuteableArray ... được khởi tạo và khai báo như vậy. – StanLe

+0

xin vui lòng kiểm tra, là mutablearray của bạn là đi ra khỏi phạm vi hoặc đang được gán lại một nơi nào đó trong mã. – Ravin

Trả lời

8

Tôi gặp sự cố này. Của tôi là tôi vô tình sử dụng loại đúc như thế này.

NSMutablearray * myarray = [[NSMutableArray alloc] init]; 
myarray =(NSMutableArray*) [mydictionary allkeys]; 

Điều này sẽ hoạt động trong một thời gian .. nhưng nếu bạn đang ở trong một vòng lặp lớn và chặt chẽ, điều này có xu hướng không thành công.

tôi đã thay đổi mã của tôi để

NSMutableArray * myarray= [[NSMutablearray alloc] initWithArray:[mydictionary allKeys]]; 
+0

NSMutableArray là trường hợp nhạy cảm (Chỉnh sửa câu trả lời của bạn) –

7

Đối tượng là NSArray, không phải là NSMutableArray.

+0

Đó là một NSMuteableArray ... được khởi tạo và khai báo như vậy. – StanLe

+0

Có lẽ loại biến là NSMutableArray, nhưng cá thể này có vẻ như là một NSArray cho đầu ra bản ghi. Hãy chắc chắn kiểm tra kỹ xem đối tượng thực sự đang được tạo ở đâu. – ThomasW

+0

@Caleb dưới đây có câu trả lời là tại sao NSArray của bạn không phải là mảng NSMutable. Ngoài ra, hãy xem phần sau: http://stackoverflow.com/questions/3220120/nsmutablearray-addobject-nsarrayi-addobject-unrecognized-selector-sent-to – ThomasW

4

Bạn đang gọi removeObjectAtIndex trên phiên bản NSArray. Chúng tôi có thể thấy rõ ràng bằng nhật ký sự cố của bạn.

4

Lỗi nói rằng bạn đang cố gắng gọi removeObjectAtIndex chọn trên một NSArray, mà sẽ không đáp ứng với selector đó.

Hãy chắc chắn rằng mảng thực sự là một NSMutableArray, không phải là một NSArray.

+0

Ya Ngăn xếp trống đúng ... – Sabby

4

Tại thời điểm này, bốn người thông minh (không bao gồm bản thân mình) đã chỉ ra rằng bạn đang gửi -removeObjectAtIndex: đến một đối tượng cho rằng đó là mảng không thể thay đổi. Đây sẽ là thời điểm tốt để bắt đầu tự hỏi lý do tại sao mảng này là không thay đổi khi bạn nghĩ rằng nó có thể thay đổi. Nếu bạn đăng một số mã cho thấy cách mảng được tạo, ai đó ở đây có thể sẽ cho bạn thấy những gì đang xảy ra.

Một cách để bạn có thể kết thúc bằng một mảng không thể thay đổi được khi bạn nghĩ rằng bạn có một mảng có thể thay đổi là sao chép một mảng có thể thay đổi. Ví dụ, bạn có thể có một tài sản:

@property (copy) NSMutableArray *myArray; 

Có lẽ bạn sau đó tạo ra một mảng có thể thay đổi, bổ sung một số đối tượng, và gán nó vào tài sản của bạn:

NSMutableArray *tempArray = [NSMutableArray array]; 
[tempArray addObject:@"You say goodbye"]; 
[tempArray addObject:@"I say hello"]; 
self.myArray = tempArray; 

Bây giờ, không tempArray điểm đến một mutable mảng hoặc mảng bất biến? Tôi chưa thử nghiệm gần đây, nhưng tôi khá chắc chắn rằng bạn nhận được một mảng bất biến. Bạn chắc chắn nhận được một immutableArray nếu bạn nói:

NSMutableArray *foo = [tempArray copy]; 

Vì vậy, hãy bắt đầu tìm kiếm các địa điểm trong mã nơi con trỏ mảng được gán lại. Sau khi tất cả, nếu con trỏ của bạn thực sự đã trỏ đến một mảng có thể thay đổi, nó sẽ rất khó để giải thích ngoại lệ mà bạn đang nhận được.

0

tôi đã cùng một vấn đề, và đó là do việc sử dụng các phương pháp sao chép. Tôi đã tự mình thực hiện một NSMutableArray * và nó đã hoạt động.

Các vấn đề liên quan