3

Objective-C でのアスタリスクの使用について質問がありました。明確にするために: 私はポインターとは何か、手続き型 C のすべてを理解しています。

1) すべての (への参照) Objective-C オブジェクト ポインターはなぜですか? 単純な変数ではないのはなぜですか? (つまり、NSArray 配列 = [[NSArray alloc] init];)

2) メソッドを呼び出すときにアスタリスクを省略するのはなぜですか?

ありがとう!

4

2 に答える 2

20

1) すべての (への参照) Objective-C オブジェクト ポインターはなぜですか? 単純な変数ではないのはなぜですか? (つまり、NSArray 配列 = [[NSArray alloc] init];)

ちょっとの間、Objective-C オブジェクトを美化された構造体と考えてください。

NSArray array;ローカルスコープでは、スタックに「割り当てられた」オブジェクトになります。 NSArray *array;通常はヒープから割り当てられたメモリの塊に支えられたオブジェクトを示します。

ずっと前に、Objective-C がスタック上のオブジェクトをサポートしないことが決定されました。ほとんどの場合、そうするとメモリ管理が非常に混乱するためです (主に-retain、スタック上の何かがまったく意味をなさない)。

Objective-C は C の純粋なスーパーセットとして設計されており、C++ とは異なり、C の基本的な動作を変更しようとはしていないため*、そこに が含まれているのは自然に思えました。

idこれは壊れていますidが、完全にジェネリックなタイプでもあることに注意してください。実際、Objective-C オブジェクトをスタックに置くことも可能です。Snow Leopard では、ブロックは実際には Objective-C オブジェクトであり、スタック上で開始されます。ただし、スタック上に独自のオブジェクトを作成することはサポートされていません。

2) メソッドを呼び出すときにアスタリスクを省略するのはなぜですか?

オブジェクトへのポインターを逆参照していないため、オブジェクトへのポインターはメソッド実装自体の中で重要です。あなたが言う時...

[anArray objectAtIndex: 5];

... 書くこととまったく同じです ...

objc_msgSend(anArray, @selector(objectAtIndex:), 5);

...そして、上記のメソッドを実装すると....

- (id) objectAtIndex: (NSUInteger) anIndex;

...このC関数を実装するのとまったく同じです...

id object_at_index(id self, SEL _cmd, NSUInteger anIndex) { ... }

つまり、Objective-C メソッドは実際には、2 つ以上の引数を取る単なる C 関数です。実際のところ、このコード行を任意のメソッド実装に貼り付けることができ、「そのまま機能します」:

NSLog(@"method %@", NSStringFromSelector(_cmd));
于 2010-01-10T04:06:56.730 に答える
2

Objective-C 言語は、コンパイル時およびリンク時から実行時まで、可能な限り多くの決定を延期します。可能な限り、オブジェクトの作成や呼び出すメソッドの決定などの操作を動的に実行します。
それで許されるなら

NSArray array = [[NSArray alloc] init];  

メソッドでは、コンパイラはコンパイル時に NSArray のサイズを知る必要があります。

于 2010-01-10T04:23:13.070 に答える