0

在 iphone 应用程序中遇到超出 NSDate 范围的问题。

我有一个这样定义的接口:

@interface MyObject : NSoObject {
    NSMutableArray  *array;
    BOOL        checkThis;
    NSDate      *nextDue;

}

现在在实现中我有这个:

-(id) init
{
    if( (self=[super init]) ) {
        checkThis = NO;
        array = [[NSMutableArray alloc] init];
        nextDue = [[NSDate date] retain];


                NSDate *testDate = [NSDate date];
    }
    return self;
}

现在,如果我跟踪初始化,在我实际分配变量之前 checkThis 显示为布尔值。数组显示为指针 0x0,因为它尚未被分配。但 nextDue 显示为“超出范围”。我不明白为什么这超出了范围,但其他变量却没有。

如果我在分配变量之前跟踪代码,则数组现在显示为已正确分配,但 nextDue 仍然超出范围。有趣的是,testDate 变量分配得很好,调试器将其显示为有效日期。

更有趣的一点是,如果我在调试时将鼠标移到 testDate 变量上,它会显示为“NSDate *”类型,这是我所期望的,因为这是它的定义。然而,对我来说,nextDue 的定义方式相同,它显示为“_NSCFDate *”。

我在这个主题上做的任何谷歌搜索都说保留是问题所在,但在我尝试分配变量之前它实际上超出了范围。

但是,在另一个类中,NSDate 的相同定义可以正常工作。在为其分配值之前,它显示为 nil。啊啊啊

4

4 回答 4

1

我还在 iphone 开发论坛上发布了这个问题。我得到的答案似乎是正确的。基本上,这只是调试器中的一件有趣的事情。实际上,考虑到我花在这上面的时间,这并不好笑。当我使用 NSLog 查看变量的结果时,它确实正确显示了该值。

NSDate 与 _NSCFDate 问题正如斯蒂芬所说,是一座免费的桥梁。

于 2009-06-11T20:54:37.950 回答
0

我不确定为什么 gdb 会告诉您日期超出范围,但请尝试删除保留。[NSDate 日期] 不需要保留。

于 2009-06-11T14:48:48.063 回答
0

我在调试时看到过这样的怪异行为,我忘记了我仍在以发布模式编译我的二进制文件。

您还应该验证您是否在 Xcode 中禁用了延迟符号加载。

于 2009-06-11T14:54:36.863 回答
0

你在这里有几个问题。

首先,为什么一些指向 0x0 的指针和其他指向 before 的指针init已经完成?好吧,它们还没有被初始化!在初始化它们之前,不能依赖它们的值。其中一些是nil(0x0) 的事实不是您应该依赖的。

二、为什么nextDue分配不正确?这听起来像是编译器的优化。确保您处于调试模式(即没有优化)。init在方法完成并返回后的某个时间点查看值是多少。您可能还想更改初始化以[[NSDate alloc] init]消除保留值的需要。

第三:NSDate_NSCFDate。基本上NSDate有一个“免费”桥接CFDate(较低级别的,类似 C 的 API,用于相同的事情)。编译器显然选择显示 CoreFoundation 版本,而不是代码中定义的版本。没什么大不了的; 我不会担心的。

于 2009-06-11T15:18:14.873 回答