首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@selector的语法

@selector的语法
EN

Stack Overflow用户
提问于 2011-06-28 02:32:55
回答 3查看 262关注 0票数 2

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

代码语言:javascript
运行
复制
...
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形式的最后一行?我就得在靶场周围放个包装纸?我只想看看那些乱七八糟的东西的语法...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-28 02:41:56

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-28 03:16:15

你可以这样做:

代码语言:javascript
运行
复制
if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    objc_msgSend(array, removeObjectMessage, @"Darth Vader", darthVaderRange);
}

虽然这看起来很脆弱..。

票数 2
EN

Stack Overflow用户

发布于 2011-06-28 02:44:18

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6497300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档