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

时间:2011-06-29 23:13:40

标签: objective-c syntax

我有:

[self schedule:@selector(tickhealth)];

tickHealth方法只有一行代码:

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

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

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

2 个答案:

答案 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:方法,则可以轻松修改它以接受并使用块代替选择器。