0

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 はブール値として表示されます。配列は割り当てられていないため、ポインター 0x0 として表示されます。しかし、nextDue は「範囲外」として表示されます。これが範囲外である理由はわかりませんが、他の変数はそうではありません。

変数が割り当てられるまでコードをトレースすると、配列は正しく割り当てられているように表示されますが、nextDue はまだ範囲外です。興味深いことに、testDate 変数は適切に割り当てられており、デバッガーはこれを有効な日付として表示します。

さらに興味深い点は、デバッグ中にマウスを testDate 変数の上に移動すると、「NSDate *」タイプとして表示されることです。これは、その定義であるためです。それでも、同じように定義されている nextDue は、'_NSCFDate *' として表示されます。

この件に関して私が行ったグーグル検索は、保持が問題であると言っていましたが、変数を割り当てようとする前に、実際には範囲外です。

ただし、別のクラスでは、NSDate の同じ定義が正常に機能します。値が割り当てられる前は nil として表示されます。ああああ

4

4 に答える 4

1

この質問はiphonedevフォーラムにも投稿しました。私がそこで得た答えは正しいようです。基本的に、それはデバッガーでの面白いことです。実際、私がそれに費やした時間を考えるとそれほど面白くありません。NSLogを使用して変数の結果を表示すると、実際には値が正しく表示されます。

NSDateと_NSCFDateの問題は、Stephenが言ったように、フリーダイヤルのブリッジです。

于 2009-06-11T20:54:37.950 に答える
0

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

まず、0x0 へのポインターとinit完了前へのポインターがあるのはなぜですか? まあ、それらは初期化されていません!それらの値は、初期化するまで信頼できません。それらの一部がnil(0x0) であるという事実は、信頼すべきものではありません。

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

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

于 2009-06-11T15:18:14.873 に答える
0

デバッグ中にこのような奇抜な動作を見たことがありますが、まだバイナリをリリース モードでコンパイルしていることを忘れていました。

Xcode で Lazy Symbol Loading を無効にしたことも確認する必要があります。

于 2009-06-11T14:54:36.863 に答える
0

gdb が日付が範囲外であると言っている理由はわかりませんが、retain を削除してみてください。[NSDate date] は保持を必要としません。

于 2009-06-11T14:48:48.063 に答える