2010-10-04 45 views
7

我有下面的代碼是產生此錯誤。我不明白爲什麼subarrayWithRange消息被髮送到一個字符串?當它明確是一個數組?無法識別的選擇器發送到實例[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]); 
} 

錯誤:

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

感謝

回答

29

這些類型的錯誤通常是內存管理相關。從本質上講,你正在發送一條消息到一個現在被其他物體佔據的地址,因爲之前的佔有者已經意外地消失了。由於該地址空間可能被任何東西佔用,你只是碰巧要問一個NSCFString,它沒有響應。

如果您在創建臨時陣列後立即暫停調試器,那麼您將看到什麼分配給臨時存儲器?我猜對於keysArray返回的東西不太正確。您可能需要仔細檢查內存是如何處理的,而不管它應該返回。按名稱,我想你的應用程序委託有一個名爲「keysArray」的數組作爲實例變量。也許這在創建或分配時沒有被正確保留?

+0

創建之後,'temp'是80個字符串數組,調試工具提示只顯示10個確保項目雖不如果這僅僅是Xcode的或不?你是正確的keysArray是我的App Delegate中的一個實例變量,一個屬性定義爲(nonatomic,retain),然後使用一個方便的方法'arrayWithContentsOfFile'來合成和分配。我不需要手動保留它嗎? – joec 2010-10-04 20:15:26

+0

是的。你沒有創造它,便利的方法。因此,如果您希望它在創建後繼續存在,則需要保留索賠(或創建自己的副本)。再看看內存管理規則。 – 2010-10-04 20:29:30

+0

如果您使用屬性訪問器而不是分配,那麼您將不需要保留;或者,你可以調用'[[NSArray alloc] initWithContentsOfFile:@「somepath」]'。 – jlehr 2010-10-04 20:58:24

4

所以我有這個。我做了一些愚蠢的事情。我將UITextView分配給一個字符串,而不是它的文本屬性。即:

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

代替:

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

我做了一些類似的蠢事。我將一個NSString分配給NSURL *,並且*不知何故錯過了編譯器的警告。 – 2014-01-31 03:48:52

相關問題