1. ホーム
  2. objective-c

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

2023-11-19 20:39:04

質問

をあてにして大丈夫でしょうか? int は常に0に初期化されるのでしょうか?

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

どのように解決するのですか?

はい、クラスのインスタンス変数は常に0に初期化されます(または nil , NULL または false というように、正確なデータ型に依存する)。 を参照してください。 Objective-C 2.0 プログラミング言語 :

alloc メソッドは新しいオブジェクトのインスタンス変数のためのメモリを動的に確保し、それらをすべて 0 に初期化します。 isa 変数以外はすべて 0 に初期化されます。


2013-05-08 を編集

Appleは上記のドキュメントを削除したようです(現在はThe Wayback Machineにリンクされています)。 (現在) 有効なドキュメント Objective-C でプログラミングする には、同様の引用が含まれています。

alloc メソッドにはもうひとつ重要な仕事があります。それは、オブジェクトのプロパティのために割り当てられたメモリをゼロに設定してクリアすることです。これは、以前に保存されていたものからゴミを含むメモリという通常の問題を回避しますが、オブジェクトを完全に初期化するには十分ではありません。


ただし、これは だけ であり、グローバルスコープで宣言された POD 型にも当てはまります。

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

一つの例外を除いて、それは ではない で割り当てられたデータには適用されません。 malloc() または realloc() についても同様です。 calloc() にも当てはまります。 calloc() は割り当てるメモリを明示的にゼロにするからです。

1 つの例外は、自動参照カウント (ARC) が有効な場合、Objective-C オブジェクトへのスタックポインタが暗黙のうちに nil に初期化されます。しかし、明示的に nil . から ARC リリースノートへの移行 :

<ブロッククオート

スタック変数の初期化には nil

ARC を使用すると、strong, weak, autoreleasing スタック変数が暗黙のうちに nil

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