我有:
[self schedule:@selector(tickhealth)];
tickHealth方法只有一行代码:
-(void)tickHealth
{
[hm decreaseBars:0.5];
}
是否可以使用块对象代替选择器。例如:
[self schedule:^{
[hm decreaseBars:0.5];
}];
答案 0 :(得分:7)
作为Caleb& 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 Ash编写的进一步的Objective-C块优点将让你用块开始:
答案 1 :(得分:4)
你不能只是传递一个块来代替选择器,因为这两个东西有不同的类型。但是,如果您可以控制-schedule:
方法,则可以轻松修改它以接受并使用块代替选择器。