使用标量参数调用选择器

时间:2011-02-04 09:44:13

标签: objective-c ios

我目前使用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。

3 个答案:

答案 0 :(得分:8)

如果您要使用objc_msgSend()必须创建一个正确的类型转换函数指针。依靠varargs映射到非varargs并不适用于所有情况。

即。你想要:

void (*myMessage)(id, SEL, NSTimeInterval) = objc_msgSend;
myMessage(delegate, aSelector, aTimeInterval);

(键入SO - 考虑语法近似。:)

答案 1 :(得分:1)

objc_msgSend旁边可以使用的内容(当然可以使用)是NSInvocation。就个人而言,我更喜欢objc_msgSend方式,因为它是最省力的方式。它也是更快的方式,但这在普通应用程序中无关紧要(在游戏中确实很重要)。

嗯,选择是你的,两种方式都有效,objc_msgSendNSInvocation没有什么不好(除了C代码在ObjC方法中看起来错误)。

答案 2 :(得分:-1)

如果代表是NSArray:使用NSArray的makeObjectsPerformSelector:(SEL)aSelector怎么样 如果您需要将对象作为参数传递,则可以使用makeObjectsPerformSelector:(SEL)aSelector withObject:(id)anObject