2013-05-10 23 views
14

Benim iphone projemde (ARC etkin), 5 yönetilen nesne (çekirdek verilerden alınmıştır) içeren bir nsmuatble dizilim var ve bazı senaryolarda bu nesneleri nsmutablearray'dan kaldırmam gerekiyorçökme

i çarpışma günlüğüne ile -[__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640

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

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

durumlarda hem nesneleri ancak ölmek üzere kaldırmak için yöntemler aşağıdaki kullanmış ve ayrıca ben

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

      surveys = [[NSMutableArray alloc]init]; 
     } 
çalıştı

herhangi birinin ben bu diziyi boş nasıl bana söyleyebilir ,, herhangi bir öneri mutluluk duyacağız, peşin

+1

Anketler nerede bildirilir ve başlatılır? Kilitlenme günlüğünden, NSMutableArray değil bir NSArray gibi görünüyor. – skladek

+2

Başka bir diziyle değiştirecek olursanız, neden tüm nesneleri diziden kaldırıyorsunuz? Sadece diziyi serbest bırakın ve sonra yeni bir tane oluşturun. – vcsjones

+0

@vcsjones ARC etkin ortamdayım, bir nesneyi nasıl bırakırım? –

cevap

16

Cevabı çok basit. İlk durum için

.
Dizininizi başlattığınız bölümü kontrol edin ve NSMutableArray nesnesine bir NSArray atadıysanız, kodunuzda bir yer olup olmadığını kontrol edin.

İkinci durum için.
Dizileri, numaralandırma sırasında diziden kaldıramazsınız.Bu, array has mutated while enumerating

+0

ya da tek bir yerde NSArray * sortDescriptors = [[NSArray alloc] atayarak initWithObjects: sortDescriptor1, nil]; anketler = (NSMutableArray *) [[[NSMutableArray ayırma] initWithArray: surveys] sıralanmışArrayUsingDescriptors: sortDescriptors]; Sanırım bu soruna neden oluyor, bunu nasıl çözebilirim? –

+0

@RaviKiran Eğer anketler bir mutableArray 'ise [anketler sortUsingDescriptors: sortDescriptors]; – Anupdas

+0

@Anupdas teşekkür ederim, iyi çalıştı –

7

hata mesajı her şeyi söylüyor içinde dan,

[__NSArrayI removeObject:]: unrecognized selector 

__NSArrayI için bir kod-kelimedir değişmez dizi (NSArray), Bu, anketlerinizin nesnesi, NSMutablArray değil, NSArray olduğu anlamına gelir.

NSArray'dan nesne ekleyemez veya çıkartamazsınız.

Kodunuzu kontrol edin. Anketlere NSArray atadınız ya da NSArray olarak yeniden başlattınız.

+0

denedim ki, onun istisnasını atarak çökmesini [__NSArrayI removeObject:]: örneğine gönderilen tanınmayan seçici 0xa391640 –

+0

NSMutableArray öğenize nesne eklemek isterseniz Bir NSArray'da, sadece bu NSArray içinde bir döngü yapın ve bunu NSMutableArray öğenize tek tek ekleyin. Bu şekilde, NSMutableArray öğenizin içindeAllObjects öğesini kaldırabilirsiniz. NSArray öğenizi doğrudan NSMutableArray öğesine atamayın, çünkü bu artık değişmez olmayan bir dizidir. – jaytrixz

1

belki bu Dizisi nesneyi kaldıramazsınız neden öylesine thats NSMutableArray sadece normal dizi değil yapıyorsun her şeyi çıkarın ve sadece bunu alıyorsanız hatadan gibi bu

[surveys removeAllObjects]; 

gibi yap bunu yapmayı deneyin ardından uygulama, böylece

Değişken olup olmadığını ben bütün o şeyi kaldırmak ve basit removeAllObject kullanmak dediğim gibi bunu başlatıldı gelmiş kazasında

çek var ve it dan

8

Bu:

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

diziniz "anketleri" (-değişebilir değil) NSArray olduğunu gösterir. Düzgün başlattığınızdan emin misin? Bu

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request] 

bir dizi "anketler" gibi bir görev bunu yaparsanız Çekirdek veri talepleri NSArrays dönmek getirme çünkü tipi NSArray olacaktır.

0

söyleyerek bir çökme ile sonuçlanacaktır. Bunun istisnası, belli bir noktada, değiştirilebilen dizinize bir immutable örneğini atadığınız çok açıktır. Yorumlardan, surveys'u sıraladığınızı ve sıralama dizisinin değişmez diziyi döndürdüğünü söyleyebilirim. Tip dökümü, değişmez bir nesnenin değiştirilebilir biçimini almak için iyi olmaz. Bunun yerine bunun

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

[surveys sortUsingDescriptors: @[sortDescriptor1]]; 
0

Sen Immutable Array başlangıç ​​durumuna olabilir kullanın. Aşağıdaki Kodu kullanın:

NSMutableArray * newArray = [NSMutableArray arrayWithArray: oldArray];

İlgili konular