2012-06-17 88 views
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)); 
} 

回答

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]; 

的區別在於功能無法捕捉到它的周圍狀態(這一個功能是功能,和塊是塊)

+0

我是Obj-C的新人。我想知道如何將函數傳遞給實例方法?你可以給我一個例子嗎?我輸入了一個函數的名字,編譯器告訴我我沒有聲明它。另外,周圍的國家是什麼意思? – Ben

+1

在學習Objective-C之前,您需要學習C語言。 :) –

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; 
} 

這應該都看起來很可識別。