74

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

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

4

3 に答える 3

117

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

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


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

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


ただし、これはクラスのインスタンス変数にのみ当てはまります。グローバル スコープで宣言された 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++ オブジェクト) では、クラス インスタンス変数もゼロで初期化されません。コンストラクターで明示的に初期化する必要があります。

于 2009-06-13T15:03:21.770 に答える
-1

初期化の値を想定する必要はないと思います。「0」値を中心にロジックを構築している場合は、確実に設定する必要があります。

于 2009-06-13T15:01:11.463 に答える