0

ばかげた質問かもしれませんが、私は本当にこれを理解したいと思っています。

たとえば、次の設定があります。

// .h
@interface MyClass : NSObject
{
   NSView *myView;
}

// .m

@implementation MyClass

-(void)someMethod
{

   // WHAT IS THE DIFFERENCE BETWEEN THIS
   myView = [[NSView alloc] init];

   // AND THIS ?

   myView = [myView init]; // assuming that myView was allocated somewhere earlier in init method
}
4

3 に答える 3

1

このステートメントmyView = [[NSView alloc] init];は、次のネストされたメソッド呼び出しです

NSView *myView =[NSView alloc]; //line 1
myView=[myView init];//line 2

1行または複数行で実行しても、特定のことは何もしません。

行 1 : ここではalloc、オブジェクトの新しいメモリ ロケーションが作成されます。

2 行目 : オブジェクトに aninitを送信して、オブジェクトを初期化します。

于 2013-04-26T05:30:46.190 に答える
0

Objective-C は、オブジェクトの作成を割り当て初期化という明示的な 2 段階のプロセスにするという点で、他の多くのオブジェクト指向言語とは異なります。

Java、C#、C++ などの言語に精通している場合、オブジェクト作成の割り当て部分は初期化から切り離せません。たとえば、Java では次のように記述できます。

class Tree {

// constructor/initialiser
public Tree ()
{
   // whatever is needed to initialise a Tree
}

}

...
Tree myTree = new Tree(); // allocate and initalise a tree

Java のnew式は a にメモリを割り当てTree、コンストラクタを呼び出してそのメモリを正しく設定します。

上記の言語は、割り当てと初期化が、実際には単一の操作であるオブジェクト作成の 2 つの部分に過ぎないことを認識しています。

Objective-C では、上記の例は次のようになります。

@implementation Tree

// constructor/initialiser
(id) init ()
{
   // whatever is needed to initialise a Tree
}

@end

...
Tree *myTree = [[Tree alloc] init]; // allocate and initalise a tree

ここでは、理論的には割り当てと初期化を分離できますが、それはお勧めできません。この理由は[Tree alloc]、通常、完全に形成された を返さないためです。Tree一部のメモリを割り当てて としてマークしますが、Treeが所有するインスタンス変数Tree、または のスーパー クラスはTree初期化されませ。初期化を行うには、init呼び出す必要があります。2 つの操作を分離すると、期待どおりに動作しない不完全なオブジェクトが横たわる可能性があります。したがって、それらを分離することはできますが、そうするのは賢明ではないため、Apple のinit状態に関するドキュメントは次のようになっています。

メッセージは、同じコード行のメッセージinitと結合されていますalloc

つまり、Apple は、ユーザーが大きな間違いを犯すのを防ぐために、小さな嘘をついているということです。

Objective-C は、作成の単一操作形式も提供します。

Tree *myTree = [Tree new]; // alloc + init

ただし、Java などとは異なり、引数を取るイニシャライザを作成すると、自動的に取得されない引数をnew取るバージョンが取得されます。それを自分で記述する必要があります (使用するクラス メソッドallocおよび引数を取るイニシャライザとして)。

HTH

于 2013-04-26T09:46:14.953 に答える