2011-11-21 10 views
1

私のobjective-cプログラム(あるいは多分、デバッグユーティリティで)私は奇妙な振る舞いをします。
私は(それが「長方形」であるとする)定義されていますが、いくつかのクラスの4つのインスタンスを割り当てられたか、初期化されていません:
Rectangle *left, *right, *bottom, *upper;Objective-Cのメモリの詳細

右この行の後、私は私の4つのオブジェクトのすべてのためにヌルポインタ(になることを期待しますXcodeでのデバッグ)がありますが、それらのうちの1つ(具体的には "upper")があるメモリ位置を指していて、そのプロパティがランダムな値で初期化されています。
通常の動作ですか?もしそうなら、理由を説明してください。 (私は客観的 - Cのプログラミングに少し新しいです)

答えて

5

目的Cは(一般的に)スタック値がゼロになることを保証しません。オブジェクト内のすべてのイーバルズがゼロになることを保証します。また、ARCの下では、オブジェクトであることを知っているスタック・バラをゼロにします。したがって、ARCを使用していないと仮定した場合の動作は正しいです。

一般に、値がゼロになる環境にいる場合でも、コードがどこか別の場所で再利用される場合は、明示的にゼロを設定する必要があります。あなたのコードが動作するために必要な制約がある場合は、それを満足させるか、実行時にテストするか、コンパイル時にテストしてください(assert())。

なぜそうなのでしょうか?Cはそのように動作するため、Cは従来からメタルであり、パフォーマンスの最適化を行うためにコンパイラに多くの自由を持たせたいからです。目的Cは、独自の(補足的な)機能をサポートするために必要な場所でのみ異なります。

2

Pro-tip:決して何も想定しません。すべての変数を既知の値に初期化することをお勧めします。この場合、nilです。

変数を初期化する別の高レベル言語から来ている場合は、これはその言語ではありません。 :-)

0

あなたがこれを行う必要があります...

Rectangle *left = nil, *right = nil, *bottom = nil, *upper = nil; 
0

利用ARCと同じである

Rectangle *left = nil; 
Rectangle *right = nil; 
Rectangle *bottom = nil; 
Rectangle *upper = nil; 

、メモリ管理などのその驚くべきは、もうあなたによって処理されていません!

関連する問題