【发布时间】:2011-02-05 01:17:03
【问题描述】:
我目前使用objc_msgSend 在对象集合上调用此类选择器。有没有更好的方法来做到这一点?这是我的代码:
@protocol ADelegateProtocol {
-(void) timeToEventOneDidChange:(NSInterval) event1;
-(void) timeToEventTwoDidChange:(NSInterval) event1;
}
- (void) delegatesPerformSelector:(SEL) selector withTimeIntervalAsFristParameter:(NSTimeinterval) timeInterval {
for (id<ADelegateProtocol> delegate in delegates) {
if([delegate respondsToSelector:selector]) {
objc_msgSend(delegate, selector, timeInterval);
}
}
}
选择器作为参数传入,timeInterval是非对象值。
注意:我不想使用 KVO。
【问题讨论】:
-
请编辑问题以添加选择器作为参数传递。这有很大的不同。
-
我认为如果不更改您要调用的方法,它不会真正变得更好,例如
NSInvocation比较繁琐。 -
如果我遗漏了什么,请见谅,但此代码假定传递给此方法的任何选择器都将
timeInterval作为参数。如果您知道参数将是什么,为什么不知道选择器将是什么?例如,可能会传入一个选择器forBar:,它接受一个NSTimeInterval作为参数,但是如果我传入一个接受字符串的fooBaz:,respondsToSelector仍然会返回true,但你会发送一个时间预期字符串并导致崩溃的间隔... -
@Jasarien:我认为这些方法可能类似于
setFooTimeStamp、setBarTimeStamp等。但最好是 Piotr 能澄清一下。 -
这一切都很好,但是如果传入任何其他带有一个代表可能响应的参数的选择器,它不会阻止程序崩溃。传递
setFooTimeStamp:或setBarTimeStamp:将是很好,但是为了争论,NSObject或其任何子类将响应awakeAfterUsingCoder:,如果传入时间戳,它将崩溃。我想说的是这段代码在受控情况下可以正常工作,但并不安全。
标签: objective-c ios