如何声明一个具有带选择器的方法/消息的类,存储选择器的值,然后稍后调用选择器?
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,但我自己找不到任何信息)
答案 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 ...
可以更好地解决所有这些问题