【问题标题】:Unrecognized Selector Sent to Instance [NSCFString subarrayWithRange:]无法识别的选择器发送到实例 [NSCFString subarrayWithRange:]
【发布时间】:2010-10-04 19:41:19
【问题描述】:

我有以下产生此错误的代码。我不明白为什么 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:]:

谢谢

【问题讨论】:

    标签: objective-c ios4 nsarray unrecognized-selector


    【解决方案1】:

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

    如果您在创建 temp 数组后立即暂停调试器,您会看到分配给 temp 的什么?我猜 -keysArray 返回的东西不太对劲。您可能需要仔细检查应该返回的内存是如何处理的。顾名思义,我想您的应用程序委托有一个名为“keysArray”的数组作为实例变量。也许在创建或分配时没有正确保留它?

    【讨论】:

    • 创建后,temp 是一个包含 80 个字符串的数组,调试工具提示仅显示 10 个项目,但不确定这是否只是 Xcode?您是正确的,keysArray 是我的 App Delegate 中的一个实例变量,该属性定义为(非原子,保留),然后使用便捷方法 arrayWithContentsOfFile 合成和分配。我不需要手动保留它吗?
    • 是的。你没有创建它,方便的方法做到了。因此,如果您希望它在创建后继续存在,您需要通过保留(或创建自己的副本)来提出索赔。再看看内存管理规则。
    • 如果您使用属性访问器而不是分配,那么您将不需要保留;或者,您可以致电 [[NSArray alloc] initWithContentsOfFile:@"somepath"]
    • 没错,但我认为了解 Objective-C 2 带来的便利(@property、@synthesize 等)背后发生了什么很重要。事实上,要在非垃圾收集环境中有效地使用 @property 声明,您需要同样了解 Cocoa 内存管理。
    • 通过将“assign”更改为“strong”解决了问题
    【解决方案2】:

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

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

    代替:

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

    【讨论】:

    • 我做了同样愚蠢的事情。我将一个 NSString 分配给一个 NSURL 并且 不知何故错过了关于它的编译器警告。
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多