【问题标题】:ios - NSArray unrecognized selector sent to instanceios - 发送到实例的 NSArray 无法识别的选择器
【发布时间】:2014-08-13 02:35:57
【问题描述】:

我有一个 NSArray 类型的实例变量 _sessions。 在整个 TableViewController 方法中,我访问它并且很好。但是当在 prepareForSegue 中,我尝试访问它或它的值时,它会抛出这个错误..

相关代码:

@interface SessionsTVC()
{

    NSArray *_sessions;
    JSONDataRetriever *jsonRetriever;
    NSString *requestURL;
}
@end

在@实现中:

_sessions = [[NSArray alloc]initWithArray:_tempArray];

给我带来麻烦的线路:

NSLog([_sessions objectAtIndex:1]);

NSLog(_sessions);

更奇怪的是这行得通:

NSLog([@(_sessions.count) stringValue]);

编辑:

NSLog([@(_sessions.count) stringValue]);还给我 2(完全正确)..

完整的错误消息

2014-08-13 23:14:46.548 ReadDatabase[15142:650918]-[会话长度]:无法识别的选择器发送到实例 0x7fb5fbf55090 2014-08-13 23:14:46.644 ReadDatabase[15142:650918] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[会话长度]:无法识别的选择器发送到实例 0x7fb5fbf55090” * 首先抛出调用栈: ( 0 CoreFoundation 0x00000001074313e5 异常预处理+ 165 1 libobjc.A.dylib 0x00000001070e1967 objc_exception_throw + 45 2核心基础0x00000001074384fd-[NSObject(NSObject)不识别选择器:]+205 3 核心基础 0x00000001073907ec ___forwarding_ + 988 4 核心基础 0x0000000107390388 _CF_forwarding_prep_0 + 120 5 核心基础 0x000000010732a39b CFStringAppendFormatCore + 235 6 核心基础 0x0000000107411c00 _CFStringCreateWithFormatAndArgumentsAux2 + 256 7 核心基础 0x0000000107420a4f _CFLogvEx2 + 127 8 基础 0x0000000106c7da22 NSLogv + 99 9 基础 0x0000000106c7d9a7 NSLog + 148 10 读取数据库 0x00000001054a36f6 -[SessionsTVC prepareForSegue:sender:] + 518 11 UIKit 0x0000000105f04716-[UIStoryboardSegueTemplate _perform:] + 151 12 UIKit 0x0000000105aa0d40-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1242 13 UIKit 0x0000000105aa0eb4-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219 14 UIKit 0x00000001059dc97e _applyBlockToCFArrayCopiedToStack + 314 15 UIKit 0x00000001059dc7f8 _afterCACommitHandler + 516 16 核心基础 0x0000000107366337 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 17 核心基础 0x0000000107366290 __CFRunLoopDoObservers + 368 18 核心基础 0x000000010735c0c3 __CFRunLoopRun + 1123 19 核心基础 0x000000010735b9f6 CFRunLoopRunSpecific + 470 20 图形服务 0x000000010960c9f0 GSEventRunModal + 161 21 UIKit 0x00000001059b9990 UIApplicationMain + 1282 22 读取数据库 0x00000001054a2bf3 主要 + 115 23 libdyld.dylib 0x0000000109def145 开始 + 1 24 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

【问题讨论】:

  • 请包括有问题的错误(不仅仅是标题)。
  • 请复制/粘贴完整错误,包括该文本后面的行话。
  • 是的,请同时添加您的错误描述
  • 如果您费心阅读,错误消息会准确地告诉您出了什么问题。或者,如果您将其发布在这里,那么我们可以阅读并告诉您出了什么问题。但是,如果缺少这一点,甚至问这个问题也没有意义。
  • 我向你保证,我玩了几个小时的错误,没有任何运气。我无法理解 [_sessions count] 消息如何正常工作,但每当我尝试访问存储在 _sessions 中的项目时,我都会收到错误消息。已将完整错误添加到问题中。谢谢各位。

标签: ios objective-c nsarray


【解决方案1】:

NSLog 需要一个字符串作为第一个参数。

试试这个:

NSLog(@"%@", _sessions);

NSLog(@"%@", [_sessions objectAtIndex:1]);

确保 _session.count 在第二种情况下大于 1。

【讨论】:

  • NSLog 还可以获取任何 nsobject 并打印其 +(nsstring*) 描述。因为所有对象都是 NSObject 的后代,这不应该是崩溃的原因。
  • 你在哪里读到的?函数签名是“void NSLog(NSString *format, ...)”。
  • 是的,我的错,它应该有一个格式说明符,我只是做了一个快速检查。
  • developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… 搜索 printf 谈到这个,它确实需要格式说明符
  • 恐怕不是问题,因为在日志消息之前,我实际上是在对消息返回的对象进行处理,但仍然导致错误。
【解决方案2】:

你会得到什么结果:

NSLog([@(_sessions.count) stringValue]);

?

因为我认为它相当于:

NSLog([[NSNumber numberWithInt:_sessions.count] stringValue]);

问题可能是 _sessions 为 nil,因此 _sessions.count 将返回 0,您将在控制台中看到 0 作为字符串。

顺便说一句,这是使用 NSLog() 打印对象的正确方法:

NSLog(@"%@", [_sessions objectAtIndex:1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多