函数调用后指针更改

时间:2014-10-17 06:32:57

标签: ios objective-c pointers

以下是关于我的问题的一些简单点;

  • 如果重要,请使用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]: unrecognized selector sent to instance 0x7fdc2870

这种情况有几件奇怪的事我无法解决;

  • 在该函数的第一行,我已经对date对象进行了类型检查。
  • 在调试器上,当我说po datep date时,这些是我得到的结果;

    (lldb) po date
    stamp
    
    (lldb) p date
    (NSDate *) $11 = 0x7fdc2870 @"stamp"
    
  • 当我转到调用RFC3339DateString函数的函数并说出p _updatedAtpo 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

1 个答案:

答案 0 :(得分:1)

我怀疑_updatedAt被覆盖了。有时它包含NSDate,有时包含NSString。添加一个观察点以查看它的写入位置。

此外,您永远不应该从nil返回RFC3339DateString(),因为这会导致[NSMutableDictionary addObject:forKey:]内的例外。

最后,您在该日期格式字符串中不需要这么多引号,只需'T''Z'