NSDate超出范围

时间:2009-06-11 14:41:30

标签: iphone nsdate

在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;
}

现在,如果我通过init跟踪,在实际分配变量之前checkThis显示为boolean。数组显示为指针0x0,因为它没有分配。但是nextDue显示为“超出范围”。我不明白为什么这超出范围但其他变量不是。

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

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当我正在调试时,我已经看到过这样的行为,我忘记了我仍然在发布模式下编译我的二进制文件。

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

答案 3 :(得分:0)

这里有几个问题。

首先,w hy是指向0x0的一些指针,而其他指针是在init之前完成的?嗯,它们尚未初始化!在您初始化它们之前,不能依赖它们的值。其中一些是nil(0x0)这一事实并不是你应该依赖的事情。

其次,为什么nextDue未正确分配?这听起来像是编译器的优化。确保您处于调试模式(即没有优化)。在init方法完成并返回后,查看稍后的值。您可能还希望将初始化更改为[[NSDate alloc] init],从而无需保留该值。

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