Objective-Cでint
sが常に0に初期化されることを期待しても安全ですか?
より具体的には、int
ivarsを持つオブジェクトが新しくインスタンス化された場合、そのivarsの値が0であると想定しても安全ですか?
はい、クラスインスタンス変数は常に0(または正確なデータ型に応じてnil
、NULL
、または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ゼロで初期化されます。コンストラクターで明示的に初期化する必要があります。