2010-10-04 71 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

相关问题