好吧,不使用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形式的最后一行?我就得在靶场周围放个包装纸?我只想看看那些乱七八糟的东西的语法...
发布于 2011-06-28 02:41:56
不幸的是,如果您传递的参数不是id
类型,则必须使用NSInvocation
对象。(否则,您可以使用performSelector:withObject:withObject:
。)
发布于 2011-06-28 03:16:15
你可以这样做:
if ([array respondsToSelector:removeObjectMessage]){
NSRange darthVaderRange=NSMakeRange(2, 3);
objc_msgSend(array, removeObjectMessage, @"Darth Vader", darthVaderRange);
}
虽然这看起来很脆弱..。
发布于 2011-06-28 02:44:18
现有的方法不允许您传递选择器和非对象参数并获得有效的方法调用。如果它是一个只接受对象参数的方法,你会做[array performSelector:removeObjectMessage withObject:@"Darth Vader" withObject:someHypotheticalRangeObject
]。
但是要使用NSRange,您必须使用NSInvocation (您已经说过您不想这样做),或者在NSObject上创建一个类别,并使用低级Objective-C运行时函数来定义一个方法,该方法接受选择器、对象参数和非对象参数并调用适当的方法。
https://stackoverflow.com/questions/6497300
复制相似问题