0

質問はタイトルにあります。コード例:

UIViewController <MyProtocol> *viewcontroller = ...;

[viewcontroller methodFromProtocol]; // I expect to be able to call all methods that the protocol defines

//UIViewControllerSubclass implements MyProtocol

UIViewControllerSubclass *viewControllerSubclassWithoutMyProtocol = [[UIViewControllerSubclass alloc] init];
[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere]; // I only expect to be able to call the methods that are defined in this class' interface even though this class implements MyProtocol
4

2 に答える 2

2

[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere];

このクラスがMyProtocolを実装している場合でも、このクラスのインターフェイスで定義されているメソッドを呼び出すことができると期待しています。

それは悪い期待です。Objective-Cを使用すると、オブジェクトが実装する任意のメソッドを呼び出すことができます。オブジェクトが実装していないメソッドを呼び出そうとすると、次の2つのことが起こります。

  • コンパイラの警告が表示されます(ただし、エラーではありません)
  • コードを実行すると、そのようなイベントを処理するための手順を実行しない限り、コードがクラッシュします。

クラスがプロトコルを実装しているが、パブリックヘッダーでそれを宣言していない場合でも、メソッドを呼び出すことができます(Objective Cにはプライベートメソッドがないため)。コンパイラの警告が表示されると思っていましたが、オブジェクトと同じXcodeプロジェクト内のファイルからこれを呼び出している場合(つまり、静的ライブラリを構築していない場合)、Xcodeが賢くなり、メソッドが存在するので、呼び出しても問題ないと判断します。

あなたの質問から、あなたが何が起こると期待し、実際に何が起こったのかは明確ではありませんでした。その情報を提供していただければ、より良い回答を提供できるようになります。

于 2012-07-13T13:16:06.333 に答える
2

あなたの質問は完全に明確ではありませんが、プロトコルに「非公開で」準拠できるかどうかを尋ねていると思いますか?

これは、インターフェイス ファイルではなく、実装ファイル内のプロトコルに準拠していることを宣言することで実行できます。ビュー コントローラーを使用すると、.m ファイルで自動的に生成されるクラスの継続でこれを行うことができます。それ以外の場合は、自分でクラスの継続を追加する必要があります。

@interface MyVCSubclass () <MyProtocol>

これで、ヘッダー ファイルのみをインポートするクラスは、コントローラーがプロトコルに準拠していることを知りません。

于 2012-07-13T13:05:42.360 に答える