0

@interface セクションが空白の場合でも、コードがコンパイルされて期待どおりの結果が返されますが、その理由がわかりません。適切なコード:

@interface XYPoint : NSObject
-(void) setX: (int) x;
-(void) setY: (int) y;
-(int) valueX;
-(int) valueY;

@end

@interface が次のようになっている場合でも、コードはコンパイルされます。

@interface XYPoint : NSObject

@end

クラス セクションの @interface 部分でメソッドを宣言しなくても、コードが機能するのはなぜですか?

完全なコード ブロックはhttp://pastebin.com/J40gJbbjにあります。

4

2 に答える 2

4

.hファイルから宣言を削除すると、他のクラスがこれらのメソッドを使用してはならないため、コードがコンパイルされます。

メソッドは、他のクラスで使用することを目的としている場合にのみ、.hファイルで宣言する必要があります。実際のクラスの実装にはまったく必要ありません。

多くの.hファイルに戻って、不要なメソッド宣言をすべて削除する必要があるようです。

.hに表示されるのは、他のクラスが使用するものだけです。これには、インスタンス変数(パブリックインスタンス変数を持つことは非常にまれです)、プロパティ、およびメソッドが含まれます。行に追加する多くのプロトコル@interfaceも.mファイルに移動する必要があります。すべてのプライベートivar、プロパティ、およびプロトコル参照を.mファイルに追加する必要があります。

于 2013-03-15T01:54:31.893 に答える
1

コンパイラは実装でそれらを見つけるのに十分なほどスマートであるため、コンパイルしたのはそのためです。

クラッシュしない理由は、Objective-C 技術的には、任意のオブジェクトに任意のメッセージを送信できますが、応答しない可能性があるためです。それがランタイムの力です。

Objective-C では必要のない型がありますが。次のように単純なダックタイピングを使用できます。

id obj = ...

if ( [myObj respondsToSelector:@selector(valueX)] )
{
  // myXYPoint talks like a XYPoint
   int aXval = [(XYPoint*)myobj valueX];

  //or if you don't like the cast,
  aXval = [myObj performSelector:@selector(valueX)];

}
于 2013-03-15T01:19:28.443 に答える