在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
答案 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版本而不是代码中定义的版本。没什么大不了的;我不担心。