0

我知道可以将块传递给实例方法,并且该方法可以编写如下,

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

此外,此方法也是一个有效的表达式。

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

我想知道我可以将什么传递给这个方法?还有这个有什么用?

此外,我想知道是否有任何 obj-c 等效于以下 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

您的第二个 Objective-C 方法采用一个 C 函数指针,其寻址函数有一个float作为输入并且什么都不返回。它与块相同:

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 回答