2011-07-04 4 views
3

私はObjective-Cの本を読んでいたように、私は次のようにクラスを初期化した例に出くわした:は常に必須か、場合によってはオプションですか?

ClassName *p = [[ClassName alloc] init]; 

それは最初、我々は初期化する前にClassNameデータを持って保存するためのメモリを割り当てる必要が理にかなっているが、ちょうど同様に、次の作品:

ClassName *p = [ClassName alloc]; 

が常に必要initですか?

+0

興味深いことに、 'init'を使用しないと便利なことはありますか? – FeifanZ

答えて

3

を、それが技術的に必須ではありません。それはNSObjectinitメソッドが事実上ちょうどreturn self;であるからです。ただし、実際にはは絶対にが必須です。オブジェクトは、内部状態の作成、プライベートメンバーの割り当て、および一般的な準備のために、initメソッドの内部で内部設定を実行します。 initメソッドは、割り当てたのと同じオブジェクトを返さない場合があります。

2つの段階で考えてみましょう。allocはメモリを割り当てますが、これはJavaのnewに似ています。 initは、オブジェクトがそのタスクを実行できるようにメモリの状態を構成します。コンストラクタを呼び出すJavaに似ています。それを放置しないでください!

+0

Cool。これを説明してくれてありがとう – JAM

+1

'alloc'も' isa'ポインタを設定する重要なステップを実行します。 –

1

特にクラスが自分のものでない場合は、常にイニシャライザメソッドの1つを呼び出す必要があります。 initから返されたポインタは、必ずしもallocによって返されるポインタと同じではありません。

ドキュメントを読む:理論的には

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-init

3

そしてあなたは正しい。厳密に "init"を指定する必要はありません。 「ALLOCは、」オブジェクトを作成するには、3つの重要な事柄ん: - すべてのインスタンス変数 を保持するのに十分なメモリを割り当てる - 変数 「ISA」インスタンスを初期化する - 他のすべてのインスタンスが0

に設定されているが、「ルートことを考えてみましょう"CocoaオブジェクトNSObjectは、単にinitメソッドで" self "を返します。

しかし、良いObj-C市民になりたい場合は、 "init"を使用する必要があります。あなたと開発者と環境の間の「契約」の一部です。

関連する問題