/ / alloc、init、およびObjective-Cの新しい[複製]-objective-c

alloc、init、およびObjective-Cの新機能[duplicate] - objective-c

iPhone プログラミングに関する 1 冊の本では、次のようなクラスをインスタンス化しています。

[[Class alloc] init]

Objective-C に関する別の本では、次のように書かれています。

[Class new]

違いは何ですか?

回答:

回答№1のための70

もともとObjective-Cでは、オブジェクトが作成されました新しいと。 OpenStep/Cocoa フレームワークが進化するにつれて、設計者は、オブジェクトへのメモリの割り当てとその属性の初期化は別の問題であるため、別のメソッドにする必要がある (たとえば、オブジェクトは特定のメモリ ゾーンに割り当てられる可能性がある) という意見を発展させました。そのため、オブジェクト作成の alloc-init スタイルが好まれるようになりました。

基本的に、新しいものは古いものであり、ほとんど非推奨ではありません.したがって、Cocoa クラスには多くの init メソッドがありますが、カスタムの新しいメソッドはほとんどないことがわかります。


答え№2のための72

+new 文字通り次のように実装されます。

+ (id) new
{
return [[self alloc] init];
}

それ以上でもそれ以下でもありません。クラスはそれをオーバーライドするかもしれませんが、それは次のようなことをするのに非常に非典型的です +fooWithBar:.


回答№3の13

すでに述べたように、デフォルトでは違いはありません。しかし、あなたは上書きすることができます new クラスメソッド。 Appleのドキュメント これにはいくつかの考えがあります。

とは異なり アロケーション, 新しい 時々です サブクラスで再実装して呼び出す クラス固有の初期化 メソッド[...]しばしば 新着... メソッドは 単なる割り当て以上のことを行い、 初期化。


答え№4の2

クラスによりますが、 [Class new] を呼び出す便利なメソッドである可能性が最も高いです [[Class alloc] init] 内部的に。したがって、「initWithString」などの他の init メソッドを呼び出すことはできません。