使用标量参数调用选择器
我目前使用objc_msgSend
在对象集合上调用这样的选择器。 有没有更好的方法呢? 这是我的代码:
@protocol ADelegateProtocol { -(void) timeToEventOneDidChange:(NSInterval) event1; -(void) timeToEventTwoDidChange:(NSInterval) event1; } - (void) delegatesPerformSelector:(SEL) selector withTimeIntervalAsFristParameter:(NSTimeinterval) timeInterval { for (id delegate in delegates) { if([delegate respondsToSelector:selector]) { objc_msgSend(delegate, selector, timeInterval); } } }
选择器作为参数传入, timeInterval
是非对象值。
注意:我不想使用KVO。
如果要使用objc_msgSend()
,则必须创建正确的类型转换函数指针才能执行此操作 。 依靠varargs映射到非varargs并不适用于所有情况。
即你想要的:
void (*myMessage)(id, SEL, NSTimeInterval) = objc_msgSend; myMessage(delegate, aSelector, aTimeInterval);
(键入SO – 考虑语法近似。:)
你可以在objc_msgSend
(当然有效)旁边使用的是NSInvocation
。 就个人而言,我更喜欢objc_msgSend
方式,因为它是最开销的免费方式。 它也是更快的方式,但这在普通应用程序中无关紧要(在游戏中确实很重要)。
好吧,选择是你的,两种方式都有效, objc_msgSend
或NSInvocation
没有什么不好(除了C代码在ObjC方法中看起来错误)。
如果委托是一个NSArray:如何使用NSArray的makeObjectsPerformSelector:(SEL)aSelector
。
如果需要将对象作为参数传递,则可以使用makeObjectsPerformSelector:(SEL)aSelector withObject:(id)anObject
。