【问题标题】:Cast to (id) to call an arbitrary method in Objective-C转换为 (id) 以调用 Objective-C 中的任意方法
【发布时间】:2014-03-06 18:08:39
【问题描述】:

我有一种情况,我需要调用对象不一定支持的方法,但同时我不能使用 performSelector,因为它限制了你可以传递给方法的参数类型。因此我这样做:

if ([someObject respondsToSelector:@selector(someMethod)])
    [(id)someObject someMethod];

编译器很高兴,我很高兴,但是这种消息发送方法有什么注意事项吗?

performSelector的同步版本和上面有什么本质区别?

编辑:与 (id) 方法相比,performSelector 是否存在性能损失?

【问题讨论】:

    标签: objective-c performselector respondstoselector


    【解决方案1】:

    这里没有特别的警告。通过强制转换为id,您将丢弃编译器时检查,但无论如何您都在使用performSelector:

    请注意,如果您使用 ARC,编译器不会让您这样做,除非它看到 一些 实现 someMethod

    【讨论】:

    • @Gavin 它在非 ARC 下发出警告,但你可以恶狠狠地笑着继续。另一方面,ARC 会阻止你死在你的轨道上。这是一个错误,而不是警告。
    • 其实在非ARC下,也只是有点唠叨而已。在 ARC 下,这是一个全面的发脾气。
    • @Gavin 我不知道你为什么选择这个。我说的是“ARC ...不会让你”。那是对的。非 ARC让你。
    • @GabrielePetronella 你的陈述基于什么? performSelector:有一个额外的间接级别:它应该首先查找并调用“performSelector”和用户的方法,而使用(id)它只是一个查找/调用。
    • @GabrielePetronella 与 performSelector 它归结为(至少)两个 objc_msgSend() 调用,而使用 (id) 它只是一个 - 您正在调用的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多