2009-06-11 107 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版本,而不是在代碼中定義的版本。沒什麼大不了的;我不會爲此擔心。