私は与えられた答えに同意しません:
A.: カテゴリのメソッドがクラスのメソッドに勝つというのは正しくありません。これは実装の詳細ですが、動作は定義されていません。
カテゴリで宣言されたメソッドの名前が、元のクラスのメソッド、または同じクラス (またはスーパークラス) の別のカテゴリのメソッドと同じである場合、どのメソッド実装が使用されるかについての動作は未定義です。ランタイム。
B.しかし、これは問題ではありません。クラスで定義されているカテゴリでメソッドを定義することも、2 つの衝突するカテゴリでメソッドを定義することもありません。シット。あなたのケースには当てはまりません。次のようなものに適用されます。
@interface A : NSObject
- (void)doSomething;
@end
@implementation A
- (void)doSomething {}
@end
@interface A (Addition)
- (void)doSomething;
@end
@implementation A (Addition)
- (void)doSomething {}
@end
あなたが正しいと私が理解しているなら、あなたはこれをしたくありません。あなたはそのようなものが欲しい:
ベースレベル:
@interface A : NSObject
@end
@implementation A
@end
@interface A (Addition)
- (void)doSomething;
@end
@implementation A (Addition)
- (void)doSomething {}
@end
クラスにあるカテゴリにメソッドがないため、これはルールに違反しません。
サブクラス レベル:
@interface B : A
@end
@implementation B
@end
@interface B (Addition)
- (void)doSomething;
@end
@implementation B (Addition)
- (void)doSomething {}
@end
A のレベルに干渉がないのと同じ理由で、B のレベルに干渉はありません。
B は A から -doSomething を継承するため、衝突があると言う人もいるかもしれません。しかし、これは衝突ではありません。なぜなら、この場合、優先規則が適用されるからです。サブクラスはメソッドを上書きします。
出来るよ。
編集:
メソッドをクラスに追加するだけで問題を確認できます。それはコンパイルされますか?衝突の場合、そうではありません。あなたの場合、そうなるでしょう。