2010-10-04 11 views
7

Bu hatayı üreten aşağıdaki koda sahibim. SubarrayWithRange iletisinin neden bir dizeye gönderildiğini anlayamıyorum? Açıkça bir dizi olduğunda?Tanınmayan Seçici Gönderilen [NSCFString subarrayWithRange:]

static const int kItemsPerView = 20; 
NSRange rangeForView = NSMakeRange(page * kItemsPerView, kItemsPerView); 

NSMutableArray *temp = [[APP_DELEGATE keysArray] mutableCopyWithZone:NULL]; 
NSArray *itemsForView = [temp subarrayWithRange:rangeForView]; 

for (int loopCounter = 0;loopCounter < r*c;loopCounter++){ 
    NSLog(@"%i: %@ ", loopCounter, [itemsForView objectAtIndex:loopCounter]); 
} 

Hata:

-[NSCFString subarrayWithRange:]: unrecognized selector sent to instance 0x6b071a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: [NSCFString subarrayWithRange:]: 

Teşekkür

cevap

29

hataları Bu tür genellikle bellek yönetimi ile ilgili bulunmaktadır. Aslında, başka bir nesne tarafından işgal edilen bir adrese bir mesaj gönderiyorsunuz, çünkü önceki işgalci beklenmedik bir şekilde ortadan kayboldu. Bu adres alanı herhangi bir şey tarafından işgal edilebileceğinden, bir NSCFString'e yanıt vermediği bir şey soruyorsunuz.

Temp dizisini oluşturduktan hemen sonra hata ayıklayıcısını duraklatırsanız, geçici olarak atanmış görmeyi ne görürsünüz? Sanırım bir şey ne olursa olsun -keysArray döndürür ile doğru değil. Geri dönmesi gereken her şeyin belleğin nasıl işlendiğini iki kere kontrol etmek isteyebilirsiniz. Adına göre, uygulamanızın temsilcisinin, örnek değişken olarak "keysArray" adlı bir dizisi olduğunu varsayalım. Belki de oluşturulduğunda veya atandığında düzgün bir şekilde tutulmuyor mu?

+0

yaratıldıktan sonra, 'temp' 80 dizelerden oluşan bir dizi, ayıklama araç ipucu yalnızca bu sadece Xcode olup olmadığını emin 10 ürün Değil olsa gösterir mi? Doğru anahtarlarArray, App Delegate'imdeki bir örnek değişkeni (nonatomic, retain) olarak tanımlanan bir özelliktir ve daha sonra sentezlenip “arrayWithContentsOfFile” kolaylık yöntemi kullanılarak atanır. Elimi tutmam gerekmiyor mu? – joec

+0

Evet. Bunu yaratmadın, kolaylık yöntemi yaptı. Bu nedenle, oluşturulduktan sonra etrafta dolaşmasını istiyorsanız, bir hak talebini muhafaza ederek (ya da kendi kopyanızı oluşturarak) hak talebinde bulunmanız gerekir. Bellek yönetimi kurallarına bir bakın. –

+0

Eğer atama yerine mülk erişimcisini kullanırsanız, o zaman muhafazaya ihtiyacınız olmaz; ya da yerine [[NSArray ayırma] initWithContentsOfFile: @ "somepath"] 'diyebilirsiniz. – jlehr

4

Bu yüzden bir tane vardı. Aptalca bir şey yaptım. UITextView öğesini text özelliği yerine bir dizeye atadım. yani:

myObj.txtbxThing = [NSString stringWithFormat:@"%@", stuffString]; 

yerine:

myObj.txtbxThing.text = [NSString stringWithFormat:@"%@", stuffString]; 
+0

Benzer bir şekilde aptalca bir şey yaptım. NSURL * 'a NSString atadım ve * bir şekilde bu konuda derleyici uyarısını kaçırdım. –

İlgili konular