使用块对象而不是选择器?

nin*_*eer 9 syntax objective-c

我有:

[self schedule:@selector(tickhealth)];
Run Code Online (Sandbox Code Playgroud)

而tickHealth方法只有一行代码:

-(void)tickHealth
{
    [hm decreaseBars:0.5];
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用块对象代替选择器.例如:

[self schedule:^{
    [hm decreaseBars:0.5];
}];
Run Code Online (Sandbox Code Playgroud)

Reg*_*ent 7

正如Caleb&bbum正确指出的那样,你不能简单地将一个块传递给你现有的(并且没有改变的)- (void)schedule:(SEL)selector;方法.

但是你可以这样做:

定义块类型:

typedef void(^ScheduleBlock)();
Run Code Online (Sandbox Code Playgroud)

schedule:要定义的更改方法与此类似:

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

然后像这样称呼它:

[self schedule:^{
    [hm decreaseBars:0.5];
}];
Run Code Online (Sandbox Code Playgroud)

Mike Ash编写的进一步的Objective-C块优点将让你用块启动:


Cal*_*leb 5

你不能只传递一个块来代替选择器,因为这两个东西有不同的类型。但是,如果您可以控制该-schedule:方法,则可以轻松修改它以接受并使用块代替选择器。