以下是关于我的问题的一些简单点;
这是在使用;
启动的单独线程上发生的self.ioThread = [NSThread.alloc initWithTarget:self selector:@selector(initData) object:nil].autorelease;
不使用ARC(无所谓)
第一个代码;
if (_updatedAt) // A simple C function call
data[@"updatedAt"] = RFC3339DateString(_updatedAt);
RFC3339DateString
功能;
NSString* RFC3339DateString(NSDate* date) {
if (!date || ![date isKindOfClass:NSDate.class]) return nil;
NSDateFormatter *rfc3339DateFormatter = NSDateFormatter.new.autorelease;
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"].autorelease;
[rfc3339DateFormatter setLocale:enUSPOSIXLocale];
[rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
[rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
return [rfc3339DateFormatter stringFromDate:date]; // point of crash.
}
所以,在我标记为"崩溃点"的行上,它说;
-[__NSCFString timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x7fdc2870
这种情况有几件奇怪的事我无法解决;
date
对象进行了类型检查。在调试器上,当我说po date
和p date
时,这些是我得到的结果;
(lldb) po date
stamp
(lldb) p date
(NSDate *) $11 = 0x7fdc2870 @"stamp"
当我转到调用RFC3339DateString
函数的函数并说出p _updatedAt
和po updatedAt
时;
(lldb) p _updatedAt
(NSDate *) $12 = 0x7fd88a10 class name = __NSDate
(lldb) po _updatedAt
2014-09-27 06:37:33 +0000
我无法理解指针是如何改变的。有人了解情况吗?
截图1; http://cl.ly/image/1n1l1E1i2a3y
截屏2; http://cl.ly/image/2A0s3S2J0S1P
汇编代码围绕代码I调用RFC3339DateString函数; http://pastie.org/private/e7xzc3ntfz0p0d95g5hzw
答案 0 :(得分:1)
我怀疑_updatedAt
被覆盖了。有时它包含NSDate
,有时包含NSString
。添加一个观察点以查看它的写入位置。
此外,您永远不应该从nil
返回RFC3339DateString()
,因为这会导致[NSMutableDictionary addObject:forKey:]
内的例外。
最后,您在该日期格式字符串中不需要这么多引号,只需'T'
和'Z'
。