2009-06-11 12 views
0

iphoneアプリでNSDateの範囲外に問題があります。NSDate of scope

私はこのように定義されたインタフェースがあります。私は、この持っている実装で今

@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として表示されます。 Arghhh

答えて

1

また、この質問をiphone devフォーラムに掲載しました。私がそこに得た答えは正しいと思われる。基本的には、デバッガの面白いことです。実際には、私が費やした時間を考えれば面白くない。変数の結果を表示するのにNSLogを使用すると、実際に値が正しく表示されます。

NSDateと_NSCFDateの問題は、フリーダイヤルのブリッジであるStephen氏の話です。

0

gdbがあなたの日付が範囲外であることを伝えている理由は分かりませんが、保持を削除してみてください。 [NSDate date]は保持を必要としません。

0

私がデバッグしているときにこのような動作が見られましたが、リリースモードでバイナリをコンパイルしているのを忘れてしまいました。

また、Xcodeでレイジーシンボルロードを無効にしていることを確認する必要があります。

0

ここではいくつか質問があります。

最初に、は、が完了する前に、0x0などのいくつかのポインタを指していますか?さて、彼らは初期化されていません!彼らの値は、あなたがそれらを初期化するまで信頼できません。それらのうちのいくつかがnil(0x0)であるという事実は、あなたが依存すべきものではありません。

次に、nextDueが正しく割り当てられていないのはなぜですか?これはコンパイラによる最適化のようです。デバッグモード(最適化なし)になっていることを確認してください。 initメソッドが完了して返された後の値が何であるかを確認してください。また、初期値を[[NSDate alloc] init]に変更して値を保持する必要がなくなりました。

第3:NSDate_NSCFDateです。基本的にはNSDateにはCFDateの「フリーダイヤル」ブリッジがあります(同じものの下位レベル、CのようなAPI)。コンパイラは、あなたのコードで定義されているバージョンではなく、CoreFoundationのバージョンを表示するように選択しているようです。たいしたことじゃない;私はそれについて心配しません。