0

C# では、デリゲート メソッドを作成し、それを変数に割り当てるか、変数であるかのようにメソッドに渡すことができます。例えば:

public delegate int Lookup(String s);
//...
public static int Evaluate(String exp, Lookup variableEvaluator)
{
//...
}

C では、任意のメソッドへのポインターを作成し、そのポインターをメソッドに渡すことができると聞きました。Objective-Cでそれを行う簡単な例を誰か教えてもらえますか? もちろん、単一のメソッドでオブジェクトを作成し、そのオブジェクトをメソッドに渡すこともできます。しかし、C# や C の方法に似た方法があるかどうか、私は興味があります。

4

3 に答える 3

2

たくさんの方法。

1つ:良い。ブロックを使用します (クロージャー、ラムダ計算、どのように呼んでも):

typedef void (^MyCallback)();

- (void)callTheCallback:(MyCallback)blockToInvoke
{
    blockToInvoke();
}

MyCallback cb = ^{
    NSLog(@"I was called! :D");
};
[self callTheCallback:cb];

2:悪い。メソッド関数自体へのポインターを取得し、それを呼び出します。(警告: この方法を使用する場合、私はあなたを訴えます。)

- (void)callTheCallback:(IMP)funcPtrToCall withObject:(id)obj selector:(SEL)sel
{
     funcPtrToCall(obj, sel);
}

- (void)someCallbackMethod
{
    NSLog(@"I was called! :D");
}

IMP implemt = [[self class] instanceMethodForSelector:@selector(someCallbackMethod)];
[self callTheCallback:implemt withObject:self selector:@selector(someCallbackMethod)];

3:醜い。デリゲートを使用します。

- (void)delegateMethodOfSomeObject:(SomeObject *)obj
{
    NSLog(@"I was called! :D");
}

SomeObject *obj = [[SomeObject alloc] init];
obj.delegate = self;
[obj makeThisObjectSomehowCallItsDelegateThatIsCurrentlySelf];
于 2012-10-12T20:42:38.183 に答える
1

2つの簡単な考えが頭に浮かびます。

簡単な答えは「ブロック」と呼ばれますが、必要なものに推奨されるレベルよりも低いレベルです。

「よりクリーンな」解決策 (読み取り: 高レベル) は、オブジェクト (「ターゲット」と呼ばれる) とセレクター (「アクション」と呼ばれる) の 2 つのパラメーターを渡すことです。これは、Objective-C では非常に一般的なパターンであるため、このパターンのみを示します。ブロックのアイデアに興味がある場合は、このドキュメントを参照してください

基本的に、オブジェクトは id として渡され、セレクターは SEL として渡される必要があります。これには、便利な @selector() コンストラクトがあります。

-(void) doThingWithTarget:(id) targetObj action:(SEL) actionSel {
  if([targetObj respondsToSelector:actionSel]) {
    [targetObj performSelector:actionSel withObject:self];
  }
}

// ...
[thatOtherObject doThingWithTarget:self action:@selector(myMethod:)];

// ... where

-(void) myMethod:(id) sender {
  // sender is the calling object, or should be by contract.
}
于 2012-10-12T20:39:09.023 に答える
0

Objective C はセレクターを使用します。http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocSelectors.html

于 2012-10-12T20:37:52.683 に答える