>如果重要的话,使用XCode 6.0.1,没有优化的llvm 6.0(DEBUG)
>这是在一个单独的线程上发生的;
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]:无法识别的选择器发送到实例0x7fdc2870
在这种情况下有几件奇怪的事我无法解决;
>在函数的第一行,我已经对类型检查日期对象进行了类型检查.
>在调试器上,当我说po日期和p日期时,这些是我得到的结果;
(lldb) po datestamp(lldb) p date(NSDate *) = 0x7fdc2870 @"stamp"
>当我去调用RFC3339DateString函数的函数并说p _updatedAt和po updatedAt;
(lldb) p _updatedAt(NSDate *) = 0x7fd88a10 class name = __NSDate(lldb) po _updatedAt2014-09-27 06:37:33 +0000
我无法理解指针是如何在中途改变的.有人了解情况吗?
截图1; http://cl.ly/image/1n1l1E1i2a3y
截图2; http://cl.ly/image/2A0s3S2J0S1P
代码周围的汇编代码我正在调用RFC3339DateString函数; http://pastie.org/private/e7xzc3ntfz0p0d95g5hzw
解决方法 我怀疑_updatedAt被覆盖了.有时它包含NSDate,有时包含Nsstring.添加观察点以查看其写入位置.此外,您永远不应该从RFC3339DateString()返回nil,因为这将导致[NSMutableDictionary addobject:forKey:]中的异常.
最后,在日期格式化字符串中,您不需要这么多引号,只是在’T’和’Z’附近.
总结以上是内存溢出为你收集整理的ios – 函数调用后指针更改全部内容,希望文章能够帮你解决ios – 函数调用后指针更改所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)