web-dev-qa-db-ja.com

intは常に0に初期化されていますか?

Objective-Cでintsが常に0に初期化されることを期待しても安全ですか?

より具体的には、int ivarsを持つオブジェクトが新しくインスタンス化された場合、そのivarsの値が0であると想定しても安全ですか?

73
Felixyz

はい、クラスインスタンス変数は常に0(または正確なデータ型に応じてnilNULL、またはfalse)に初期化されます。 Objective-C 2.0プログラミング言語 を参照してください:

allocメソッドは、新しいオブジェクトのインスタンス変数にメモリを動的に割り当て、それらをすべて0に初期化します。つまり、新しいインスタンスをクラスに接続するisa変数を除きます。


EDIT 2013-05-08
Appleは上記のドキュメントを削除したようです(現在はWayback Machineにリンクされています)。 (現在)アクティブなドキュメント Programming With Objective-C には同様の引用が含まれています。

allocメソッドにはもう1つの重要なタスクがあります。これは、オブジェクトのプロパティをゼロに設定することにより、割り当てられたメモリをクリアすることです。これにより、以前に保存されたガベージを含むメモリの通常の問題を回避できますが、オブジェクトを完全に初期化するには不十分です。


ただし、これはクラスのインスタンス変数に対してonlytrueです。グローバルスコープで宣言されたPODタイプにも当てはまります。

_// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil
_

1つの例外を除き、ローカル変数、またはmalloc()またはrealloc();で割り当てられたデータについては、nottrueです。 calloc()の場合は、calloc()が割り当てたメモリを明示的にゼロにするため、trueです。

1つの例外は、自動参照カウント(ARC)が有効な場合、Objective-Cオブジェクトへのスタックポインターが暗黙的にnilに初期化されることです。ただし、nilに明示的に初期化することをお勧めします。 Transitioning to to ARC Release Notes から:

スタック変数はnilで初期化されます

ARCを使用して、strong、weak、およびautoreleasingスタック変数がnilで暗黙的に初期化されるようになりました

C++(およびObjective-C++で使用されているC++オブジェクト)では、クラスインスタンス変数もnotゼロで初期化されます。コンストラクターで明示的に初期化する必要があります。

112
Adam Rosenfield