3

再投稿の場合は申し訳ありませんが、一言で説明できないため、検索できませんでした。私はたくさんのメソッドを持つスーパークラスを持っていますが、それらは常に(すべてではありませんが)サブクラス化されます。スーパーから私はそれらのメソッドを実行する必要があります。メソッドをスーパー空のままにするか、スーパーで入力せずにとにかく呼び出す[self myMethod]ことができます。スーパーに存在しなくても、サブクラス化されたメソッドが呼び出されます。これは機能しますが、Xcodeでエラーが発生します。'superclass' may not respond to '-subclassmethod'

警告が表示されないようにするにはどうすればよいですか?

4

4 に答える 4

4

私は次のようにスーパークラスで実装されていないメソッドを定義することを好みます。

@interface GLObject : NSObject {}
- (id)someSubclassProvidedMethod;
@end

@implementation GLObject
- (id)someSubclassProvidedMethod {
  [self doesNotRecognizeSelector: _cmd];
}
@end

-doesNotRecognizeSelector:メソッドをまったく定義しなかった場合、Objective-Cランタイムが最終的に呼び出すため、ほぼ完全に冗長です。しかし、私はそれを定義しているので、それはクラスのインターフェースにあり、コンパイラーを満足させ、いくつかのドキュメントを提供してくれます。

于 2010-04-05T09:41:27.423 に答える
1

スーパークラスではなく、プロトコルでメソッドを宣言することができます。これは、他の言語では「インターフェイス」と呼ばれます。

@protocol MyProtocol
-(id)myMethodWith:(id)arg;
@end

変数の型宣言を変更して、オブジェクトがプロトコルに準拠していることを宣言します。

-(id)doStuffWith:(SuperClass <MyProtocol> *)aThing and:(id)another {
    return [aThing myMethodWith:another]
}

SuperClassのインスタンスはdoStuffWith:and:MyProtocolを実装しないため、に渡すことはできませんが、それはあなたが望むもののように聞こえることに注意してください。

于 2010-04-05T11:44:49.890 に答える
1

私の解決策は少し奇妙でしたが、ここにあります:

@protocol JSDog <NSObject>
- (void)yipe;
@end

@interface JSDog : NSObject
@end

@implementation JSDog

+ (void)initialize {
  if ([self isSubclassOfClass:[JSDog class]] && ![self conformsToProtocol:@protocol(JSDog)]) {
    NSAssert(false, @"Subclasses of JSDog must conform to <JSDog>.");
  }
}

@end

クラスと同じ名前のプロトコルを持つことは、で先行されNSObjectます。正式なプロトコルのメソッドはデフォルト@requiredでaであるため、両端で保護されます。コンパイル時に、JSDogサブクラスがに準拠することを意図している<JSDog>が実装していない-yipe場合、エラーが発生します。実行時に、サブクラスがに準拠していると主張していない<JSDog>場合、サブクラスがインスタンス化されたときに警告が表示されます。

于 2010-04-05T13:11:22.807 に答える
0

私は最近、このタスクにNSAssertを使用するのが好きです。

- (BOOL)proceedForVersion:(int)versionInteger
{
    NSAssert(false, @"This method needs to be overridden in a subclass of iMBApertureAbstractParser");

    return NO;
}
于 2010-04-05T11:10:31.410 に答える