发送到实例的无法识别的选择器[NSCFString subarrayWithRange:]

时间:2010-10-04 19:41:19

标签: objective-c ios4 nsarray unrecognized-selector

我有以下代码产生此错误。我无法理解为什么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:]:

由于

2 个答案:

答案 0 :(得分:29)

这些错误通常与内存管理有关。基本上,您正在向一个现在被其他对象占用的地址发送消息,因为前一个占用者意外地消失了。由于该地址空间可能被任何东西占用,因此您恰好会向NSCFString询问它没有响应的内容。

如果在创建临时数组后立即暂停调试器,您认为分配给temp的是什么?无论-keysArray返回什么,我猜测某些事情并不完全正确。您可能想要仔细检查内存是如何处理的。根据名称,我认为你的app委托有一个名为“keysArray”的数组作为实例变量。也许在创建或分配时没有正确保留?

答案 1 :(得分:4)

所以我有这个。我做了一些愚蠢的事。我将UITextView分配给字符串而不是它的text属性。即:

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

而不是:

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