2013-05-10 29 views
14

Trong dự án iphone của tôi (ARC kích hoạt) tôi có một mảng nsmuatble trong đó có khoảng 5 đối tượng được quản lý (được lấy từ dữ liệu cốt lõi) và trong một số kịch bản tôi cần phải loại bỏ tất cả các đối tượng từ nsmutablearray rằngtai nạn trong khi loại bỏ các đối tượng từ NSMutableArray

tôi đã sử dụng các phương pháp để loại bỏ đối tượng nhưng bị rơi nó trong cả hai trường hợp với nhật ký sự cố -[__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640

if (surveys && [surveys count]>0) 
     { 

      [surveys removeAllObjects]; 
      surveys = [[NSMutableArray alloc]init]; 
     } 

sau và cũng có thể tôi đã cố gắng

if (surveys && [surveys count]>0) 
     { 
      for(Survey *obj_Survey in surveys) 
      { 
       [surveys removeObject:obj_Survey]; 
      } 

      surveys = [[NSMutableArray alloc]init]; 
     } 

có thể bất kỳ một cho tôi biết làm thế nào để làm trống mảng ,, bất cứ đề nghị sẽ được đánh giá, thanx trước

+1

Các khảo sát được khai báo và khởi tạo ở đâu? Từ bản ghi sự cố, có vẻ như đó là NSArray không phải NSMutableArray. – skladek

+2

Tại sao bạn xóa tất cả các đối tượng khỏi mảng nếu bạn chỉ thay thế nó bằng một mảng khác? Chỉ cần phát hành mảng sau đó tạo một mảng mới. – vcsjones

+0

@vcsjones i am trong môi trường kích hoạt ARC, làm thế nào để tôi phát hành một đối tượng? –

Trả lời

16

Câu trả lời rất đơn giản.

Đối với trường hợp đầu tiên.
Kiểm tra phần mà bạn đã khởi tạo mảng của mình và kiểm tra xem có nơi nào đó thông qua mã của bạn hay không, nếu bạn đã gán NSArray cho đối tượng NSMutableArray của mình.

Đối với trường hợp thứ hai.
Bạn không thể xóa các đối tượng khỏi mảng trong khi đang liệt kê thông qua nó.Điều này sẽ dẫn đến một vụ tai nạn nói rằng array has mutated while enumerating

+0

ya ở một nơi tôi đang gán NSArray * sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor1, nil]; survey = (NSMutableArray *) [[[NSMutableArray alloc] initWithArray: survey] sortArrayUsingDescriptors: sortDescriptors]; tôi đoán điều này gây ra vấn đề đó, làm thế nào tôi có thể giải quyết vấn đề này? –

+0

@RaviKiran Nếu bạn khảo sát là một mutableArray '[survey sortUsingDescriptors: sortDescriptors];' sẽ làm tốt. – Anupdas

+0

@Anupdas cảm ơn bạn, nó hoạt động tốt –

7

Các thông báo lỗi nói lên tất cả,

[__NSArrayI removeObject:]: unrecognized selector 

__NSArrayI là một mã chữ cho một mảng bất biến (NSArray), Điều đó có nghĩa là đối tượng khảo sát của bạn là không phải NSMutablArray, nhưng NSArray.

Bạn không thể thêm hoặc xóa đối tượng khỏi NSArray.

Kiểm tra mã của bạn. Bạn đã chỉ định NSArray cho các cuộc khảo sát hoặc bạn đã khởi tạo lại nó là NSArray.

+0

tôi đã thử rằng ,,, sự cố của nó bằng cách ném ngoại lệ [__NSArrayI removeObject:]: bộ chọn không nhận dạng được gửi tới trường hợp 0xa391640 –

+0

Nếu bạn muốn thêm các đối tượng trong NSMutableArray của bạn trong một NSArray, chỉ cần làm một vòng lặp for bên trong NSArray đó và thêm nó từng cái một vào NSMutableArray của bạn. Bằng cách đó, bạn có thể removeAllObjects bên trong NSMutableArray của mình. Không trực tiếp gán NSArray của bạn cho NSMutableArray đó vì nó làm cho nó trở thành một mảng không thể thay đổi được nữa. – jaytrixz

1

Hủy bỏ tất cả những điều mà bạn đang làm và chỉ đơn giản là làm như thế này

[surveys removeAllObjects]; 

Kể từ lỗi mà bạn đang nhận được như vậy có lẽ là mảng không phải là NSMutableArray chỉ mảng bình thường do đó, thats lý do tại sao bạn không thể loại bỏ đối tượng từ đó và bạn cố gắng làm như vậy và ứng dụng đã sụp đổ

kiểm tra mà bạn đã khởi tạo nó nếu nó là Biên Đổi hay không

nên như tôi đã nói loại bỏ tất cả những gì điều và sử dụng đơn giản removeAllObject

8

này:

[__NSArrayI removeObject:] : unrecognized selector sent to instance 0xa391640 

chỉ ra rằng mảng "khảo sát" của bạn là NSArray (không-có thể thay đổi). Bạn có chắc là bạn đã khởi tạo đúng cách không? Nếu bạn thực hiện việc này bằng cách chuyển nhượng như thế này

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request] 

một mảng "khảo sát" sẽ thuộc loại NSArray vì yêu cầu tìm nạp dữ liệu lõi trả về NSArrays.

0

Từ trường hợp ngoại lệ, điều hiển nhiên là bạn đang chỉ định một trường hợp bất biến cho mảng có thể thay đổi của bạn. Từ các ý kiến ​​tôi có thể làm ra rằng bạn đang phân loại surveys và sắp xếp mảng đã trở về mảng bất biến. Loại đúc sẽ không làm tốt để có được mutableCopy của một đối tượng bất biến.

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil]; 
surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors]; 

Thay vì nó sử dụng

[surveys sortUsingDescriptors: @[sortDescriptor1]]; 
0

Bạn có thể khởi tạo với Immutable Array. Sử dụng Mã sau:

NSMutableArray * newArray = [NSMutableArray arrayWithArray: oldArray];