0

TheTabBarController では、UINavigationControllerDelegate プロトコルに準拠せずに、クラスを moreNavigationController.delegate に割り当てることができました。

// without conforming to protocol, <UINavigationControllerDelegate>
@interface TheTabBarController : UITabBarController 

self.moreNavigationController.delegate = self;

次の警告が発生するだけですが、コンパイルは成功します。

互換性のない型 'TheTabBarController *const __strong' から 'id' に割り当てています

プロトコルのメソッドは実行時にエラーなしで呼び出されます。一部のView Controllerのナビゲーションバーを非表示にするために使用します。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

だから、知りたいのですが、これは合法で安全ですか、それとも; 後でクラッシュするか、メモリリークしますか?これは意味的にどのように許可されますか? インターフェイスで定義されておらず、プロトコルが準拠していないにもかかわらず、ランタイムはどのようにメソッドを解決できますか? または、UITabBarController は、プロトコルに準拠する非表示のカテゴリを使用していますか?

4

1 に答える 1

1

プロトコルには実行時の意味はありません。これらは、コンパイル中に、現在行っているようなことを行おうとしたときにタイプエラーを表示するためにのみ使用されます。それがプロトコルを実装しているTheTabBarControllerのなら、なぜあなたはなりたくないのですか?UINavigationControllerDelegate

Objective-Cでは、任意のオブジェクトに対して任意のメソッドを呼び出すことができ、実装forwardInvocation:(NSInvocation *)anInvocationまたは関連するメソッドの1つによってそれを処理する場合があります。objc_install_instance_methodおよび関連する関数を使用して、実行時にオブジェクトまたはクラスに新しいメソッドを追加することもできます。

于 2012-05-18T08:53:14.093 に答える