0

ブロックをインスタンスメソッドに渡すことができ、メソッドは次のように記述できることを知っています。

-(void)Method:((void) (^)(float)f)
{
    f(0.5);
}

また、このメソッドも有効な式です。

-(void)Method:((void) (*)(float)f)
{
    f(0.5);
}

このメソッドに何を渡すことができるか知りたいですか?そして、これの使用法は何ですか?

その上、私は次のc#コードに相当するobj-cがあることを知りたいですか?obj-cに関数ポインタがあるかどうか疑問に思っているからです。

public static float Sum(float x, float y)
{
    return x+y;
}
public delegate float Operation(float x, float y);
public static Main()
{
    Operation dSum = Sum;
    Console.WriteLine(dSum(0.5, 1.5));
}
4

2 に答える 2

1

これにはObjective-Cは必要ありません。あなたがやろうとしていることは、かなり簡単にストレートCに変換できます。

static float sum(float x, float y)
{
    return x + y;
}

typedef float (*Operation)(float x, float y);

int main(int argc, char **argv)
{
    Operation dSum = sum;
    printf("%f\n", dSum(0.5, 1.5));
    return 0;
}

それはすべてかなり認識できるように見えるはずです。

于 2012-06-17T15:50:04.863 に答える
1

2番目のObjective-Cメソッドは、アドレス指定された関数がfloat入力としてaを持ち、何も返さないC関数ポインターを受け取ります。ブロックと同じです:

typedef void (^ BlockType)(float);
- (void)blockMethod: (BlockType)block {
    block(1.0);
}
[obj blockMethod:aBlock];

対。

typedef void (* FuncType)(float);
- (void)funcMethod: (FuncType)func {
    func(1.0);
}
[obj funcMethod:aFunc];

違いは、関数がその周囲の状態をキャプチャできないことです(そして、関数は関数であり、ブロックはブロックです)。

于 2012-06-17T15:51:09.363 に答える