12

クラスのデリゲートを作成しました

@protocol gameDelegate <NSObject>
@optional
-(void)gameStarted;
@required
@end

今私のゲームオブジェクトで私はこのメソッドを呼び出しました:

[self.delegate gameStarted];

したがって、このオブジェクトをどこかで開始し、デリゲートを設定すると、gameStatedが呼び出されるまですべてが正常に機能します。これは、ゲームオブジェクトが作成されるメインオブジェクトに実装されていないためです(オプションであるため)。

私はこれのいくつかのバリエーションを試しました

if(![self.delegate respondsToSelector: @selector(gameStarted)]) {
    //[self.delegate gameStarted];
}

しかし、これは私にはうまくいきません。これを「本当に」オプションにする方法はありますか?

前もって感謝します

4

3 に答える 3

18

ifステートメントから否定を省略します。

if ([self.delegate respondsToSelector:@selector(gameStarted)]) {
    ...
}
于 2010-11-22T22:53:09.150 に答える
0

デリゲートがオプションのメソッドを実装しているかどうかを確認してから呼び出すというパターンはよくあるので、メソッドSAFE_CALLを確認respondToSelector:してから呼び出すプリプロセッサ マクロを使用します。

マクロは次のとおりです。

#define SAFE_CALL(obj,method) \
([obj respondsToSelector:@selector(method)] ? [obj method] : nil)

次のように使用されます。

SAFE_CALL(sourceDelegate, refresh)
// or 
NSString *response = SAFE_CALL(object, responseValue)

このバージョンは、パラメーターのないメソッドでのみ機能することに注意してください。

元々は C 関数として実装されていましたが、performSelectorARC を使用するとリークで警告が発生します。プリプロセッサ マクロとして、期待どおりに動作します。

于 2014-02-11T09:18:23.843 に答える