int
Objective-C で s が常に 0 に初期化されることを期待しても安全ですか?
より具体的には、int
ivar を持つオブジェクトが新しくインスタンス化された場合、その ivar の値が 0 であると想定しても安全ですか?
int
Objective-C で s が常に 0 に初期化されることを期待しても安全ですか?
より具体的には、int
ivar を持つオブジェクトが新しくインスタンス化された場合、その ivar の値が 0 であると想定しても安全ですか?
はい、クラス インスタンス変数は常に 0 に初期化されます (正確なデータ型に応じて、またはnil
、NULL
、または)。Objective-C 2.0 プログラミング言語false
を参照してください。
この
alloc
メソッドは、新しいオブジェクトのインスタンス変数にメモリを動的に割り当て、それらをすべて 0 に初期化します。isa
つまり、新しいインスタンスをそのクラスに接続する変数を除くすべてです。
EDIT 2013-05-08
Apple は上記のドキュメントを削除したようです (現在は The Wayback Machine にリンクされています)。(現在) アクティブなドキュメントProgramming With Objective-Cには、同様の引用が含まれています。
メソッドにはもう
alloc
1 つの重要なタスクがあります。それは、オブジェクトのプロパティに割り当てられたメモリをゼロに設定してクリアすることです。これにより、以前に格納されたものからのガベージを含むメモリの通常の問題が回避されますが、オブジェクトを完全に初期化するには不十分です。
ただし、これはクラスのインスタンス変数にのみ当てはまります。グローバル スコープで宣言された POD 型にも当てはまります。
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
1 つの例外を除いて、ローカル変数、またはまたはで割り当てられたデータには当てはまりません。割り当てたメモリを明示的にゼロにするので、これは に当てはまります。malloc()
realloc()
calloc()
calloc()
1 つの例外は、自動参照カウント (ARC) が有効になっている場合、Objective-C オブジェクトへのスタック ポインターが暗黙的に に初期化されることnil
です。ただし、明示的に に初期化することをお勧めしますnil
。ARC リリース ノートへの移行から:
スタック変数は次で初期化されます
nil
ARC を使用すると、ストロング、ウィーク、および自動解放スタック変数が暗黙的に初期化されます。
nil
C++ (および Objective-C++ で使用されている C++ オブジェクト) では、クラス インスタンス変数もゼロで初期化されません。コンストラクターで明示的に初期化する必要があります。
初期化の値を想定する必要はないと思います。「0」値を中心にロジックを構築している場合は、確実に設定する必要があります。