【问题标题】:NSString.length causes crash (NSInvalidArgumentException)NSString.length 导致崩溃(NSInvalidArgumentException)
【发布时间】:2015-01-10 17:29:27
【问题描述】:

我有一个 iPad 应用程序(XCode 6.1.1、iOS 8.1、ARC),当我在 8.1 模拟器上运行它时,应用程序在比较字符串长度时崩溃。这已经运行了一年多,昨天停止了。这是代码:

这是.h文件中的代码:

@property NSString *shopOpenHour;
@property NSString *shopCloseHour;

这是.m文件中的代码:

@synthesize shopOpenHour;
@synthesize shopCloseHour;

和:

if(shopOpenHour.length == 0 || shopCloseHour.length == 0)  { 

这也会导致崩溃:

NSLog(@"\n\nlength test: %d", (int)shopCloseHour.length);

这是我得到的错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xb000000000003203”

在 7.1 模拟器和运行 iOS 8.1 的 iPad 下运行良好。我不明白 NSCFNumber 在“图片中”的位置/原因。

我的问题是:关于是什么原因的任何想法(在我提交 RADAR 之前?)

【问题讨论】:

  • 听起来是可以重现的。为什么不定义你自己的设置器来检查参数的类型并在它不是NSString 时转储堆栈跟踪/断点?
  • 也许您定义了另一个名为shopCloseHour 的字段?在您的ifNSLog 语句中将shopCloseHour 替换为_shopCloseHour,然后重试。

标签: objective-c nsstring ios8.1


【解决方案1】:

您在某处为 shopCloseHour 分配了 NSNumber,它可能在从 json 分配值时发生。检查

if ([shopCloseHour isKindOfClass:[NSString class]]) {
    // this is a string …
}

【讨论】:

  • 显然,当从 NSUserDefaults 存储或检索时,它会发生变化。非常感谢...今天这会让我有很多事情要做! :D
  • 最好解决问题的原因。在此答案中使用 if 语句将有助于调试,但代码不应保留。
  • 为了防止这种情况,您应该使用 NSUserDefaults 的特定类型方法来避免这种情况,而不是使用 objectForKey:
猜你喜欢
  • 2020-07-22
  • 2014-10-08
  • 2017-04-18
  • 2018-01-23
  • 2020-12-02
  • 2013-11-11
  • 2011-01-24
  • 2015-02-23
  • 2011-04-23
相关资源
最近更新 更多