使用选择器请求回调

时间:2009-09-07 22:34:12

标签: objective-c cocoa

如何声明一个具有带选择器的方法/消息的类,存储选择器的值,然后稍后调用选择器?

ie 如果它被称为SomeObject,它将被调用如下:

-(id) init {
    // normal stuff here
    o = [[SomeObject alloc] init];
    return self;
}

-(void) checkSomething {
    [o checkSomethingWithResponse: @selector(answer:)]
}

-(void) answer: (int) value {
    NSLog(@"Check complete: %d", value);
}

(抱歉,我知道这可能是RTFM,但我自己找不到任何信息)

1 个答案:

答案 0 :(得分:6)

SomeObject类需要引用返回要发送消息的对象。

这几乎就是委托模式;查看实现细节。

(请注意,委托模式通常允许委托的所有方法都是可选的。在这种情况下,如果需要-answer:这更像是UITableViewDataSource或NSTableView的数据源。但是细节实现就像委托模式一样,您可能不需要测试以查看对象是否实现了该方法。

或者,假设您确实需要使用整数值发送的目标/选择器(目标/操作,在Cocoa用语中)对:

我建议重新声明-answer:as:

- (void) answer: (NSNumber *) aValue;

这避免了处理非对象参数的需要。

在SomeObject类中,你有类似的东西:

[myAnswerer performSelector: myAnswererSelector withObject: [NSNumber numberWithInt: 1]];

你甚至可以将myAnswerer和myAnswererSelector声明为:

@property(retain) MyAnswererClass *myAnswerer;
@property SEL myAnswererSelector;

然后在SomeObject的实现中使用@synthesize来合成setter / getter。

请注意,在SnowLeopard上,使用Blocks ...

可以更好地解决所有这些问题