2017-11-08 10 views
0

Java、C++ 11およびその他の言語では、メソッドが基本クラスまたはインタフェースから別のメソッドをオーバーライドするように指定できます。後でそのメソッドを削除すると基本クラスからコンパイルエラーが発生します。私はオプションのメソッドをたくさん使ってプロトコルを使用しています。そこからメソッドを削除すると、そのメソッドを実装したコードを削除するのを忘れる傾向があります。これはエラーや警告を生成しないため、「死んだ」メソッドが作成されます。Objective-C「オーバーライド」指定子

を考えてみましょう:

@protocol Prot <NSObject> 
@optional 
- (void)bar; 
- (void)tempBar; 
@end 

@interface MyType : NSObject <Prot> 
@end 

@implementation MyType 
- (void)bar { /**/ } 
- (void)tempBar { /**/ } 
@end 

を私は一点でのプロトコルからtempBarを削除した場合、私はMyTypeで実施さtempBarから少なくとも警告を取得したいと思います。

Objective-Cにメソッドがプロトコルメソッドの実装であると指定する方法はありますか?

答えて

1

Objective-Cは動的言語であり、コンパイル時に実行することはむしろ不可能です。 Obj-Cでは、実際にそこには存在しないメソッドを実際に呼び出すことができ、アプリケーションはクラッシュしないことに注意してください(デフォルトの実装では例外が発生しますが、その動作を変更できます)。

このメソッドは、拡張で追加することも、実行時に追加することもできます。それとも、ヘッダーに存在しないだけです。

また、反対の問題もあります。サブクラス化すると、ヘッダーに存在しないため、存在しないメソッドもオーバーライドできます。

これはAppleが予測可能な言語、つまりSwiftに移行している理由の1つです。