2009-06-11 108 views
0

在iphone应用程序中出现NSDate超出范围的问题。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显示为布尔值。数组显示为指针0x0,因为它没有分配。但nextDue显示为“超出范围”。我不明白为什么这是超出范围,但其他变量不是。

如果我通过代码跟踪,直到变量被分配之后,阵列现在显示为被正确地分配,但nextDue仍超出范围。有趣的是,testDate变量分配得很好,调试器显示这是一个有效的日期。

而且有趣的一点是,如果我将鼠标移动到该testDate变量,而我调试,它显示了作为我所期望的,因为这是它定义一个“的NSDate *”类型。然而nextDue,对我来说,定义的方式与'_NSCFDate *'相同。

任何谷歌搜索我关于这个问题确实说,保留的问题,但其实际超出范围之前,我甚至尝试了变量分配。

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

回答

1

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

NSDate与_NSCFDate问题是斯蒂芬说的,一个免费的桥梁。

0

我不知道为什么GDB告诉你日期超出范围,但尝试删除保留。 [NSDate日期]不需要保留。

0

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

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

0

这里有几个问题。

首先,why是一些指向0x0和其他指向init已完成?那么,他们还没有初始化!在你初始化它们之前,不能依赖它们的价值。事实上,其中一些是nil(0x0)不是你应该依赖的。

其次,为什么nextDue分配不正确?这听起来像编译器的优化。确保你处于调试模式(即没有优化)。在init方法完成并返回后,查看该值在某个晚些时候的值。您可能还想将初始化更改为[[NSDate alloc] init],这样就不需要保留该值。

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