2

好的,不使用NSInvocation,假设我有这个代码:

...
array = [NSMutableArray arrayWithObjects:@"Yoda", @"Jedi", @"Darth Vader", @"Darth Vader", @"Darth Vader" , @"Darth Vader", nil];

SEL removeObjectMessage = @selector(removeObject:inRange:);

//does array allow us to remove and object in a range? if so let's do this    
if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    [array removeObject:@"Darth Vader"inRange:darthVaderRange];
}

我将如何以 SEL removeObjectMessage 的形式执行最后一行?我必须在范围周围放一个包装器吗?我只想看看所有这些乱七八糟的语法......

4

3 回答 3

2

你可以这样做:

if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    objc_msgSend(array, removeObjectMessage, @"Darth Vader", darthVaderRange);
}

虽然看起来很脆弱……

于 2011-06-27T19:16:14.570 回答
1

不幸的是,如果你传递的参数不是 type id,你必须使用一个NSInvocation对象。(否则,您可以使用performSelector:withObject:withObject:.)

于 2011-06-27T18:41:56.217 回答
1

没有现有的方法允许您传递选择器和非对象参数并获得有效的方法调用。如果它是一个只接受对象参数的方法,你会这样做[array performSelector:removeObjectMessage withObject:@"Darth Vader" withObject:someHypotheticalRangeObject]。

但是要使用 NSRange,您必须使用 NSInvocation(您说过不想这样做)或在 NSObject 上创建一个类别并使用低级 Objective-C 运行时函数来定义一个方法它接受一个选择器、一个对象参数和一个非对象参数并调用适当的方法。

于 2011-06-27T18:44:17.913 回答