2011-06-29 13 views
9

我有:使用塊對象而不是選擇器?

[self schedule:@selector(tickhealth)]; 

而且tickHealth方法只有一行代碼:

-(void)tickHealth 
{ 
    [hm decreaseBars:0.5]; 
} 

是有可能在適當位置的選擇器的使用塊的對象。例如像:

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 

回答

7

由於迦勒& bbum正確地指出,你不能塊簡單地傳遞到您現有的(不變)- (void)schedule:(SEL)selector;方法。

但是,您可以這樣做:

定義塊類型:

typedef void(^ScheduleBlock)(); 

變化schedule:方法來定義與此類似:

- (void)schedule:(ScheduleBlock)block { 
    //blocks get created on the stack, thus we need to declare ownership explicitly: 
    ScheduleBlock myBlock = [[block copy] autorelease]; 
    //... 
    myBlock(); 
} 

然後調用它像這樣:

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 
由Mike灰編譯

進一步的Objective-C塊善良,將讓你與動工塊:

+0

此方法與OP的方法不兼容; SEL與塊不同。 – bbum

+0

@bbum:對,這就是爲什麼我寫了「Define'schedule:'類似於這個的方法:...」。爲了清楚起見,應該寫成「重新定義」,也許。糾正。 – Regexident

4

你不能僅僅通過一個塊代替選擇器,因爲這兩個東西有不同的類型。但是,如果您可以控制-schedule:方法,則可以輕鬆修改它以接受和使用代替選擇器的塊。

相關問題