【问题标题】:Question about dynamic binding, Objective C and methods关于动态绑定、Objective C 和方法的问题
【发布时间】:2011-07-07 09:37:02
【问题描述】:

根据 Apple 的 Objective C 指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数。

然后有一些关于“静态类型”方法是例外的事情。

因此,具有相同名称和返回类型 + 参数的方法共享一个选择器,但如果它只是名称相同但返回类型和/或参数不同,它将具有不同的选择器 - 如果您发送这样的消息给它...好吧我不知道。

【问题讨论】:

    标签: objective-c methods dynamic-binding


    【解决方案1】:

    选择器代表方法名称,而不是方法签名。在以下示例中:

    - (void)someMethod:(int)intParam;
    - (id)someMethod:(float)floatParam;
    

    这两个方法具有相同的名称 (someMethod:),因此具有相同的选择器:@selector(someMethod:)

    假设您在名为Foo 的类中声明了第一个方法,在名为Bar 的类中声明了第二个方法。那么:

    Foo *foo = …;
    Bar *bar = …;
    
    [foo someMethod:42];
    [bar someMethod:3.1416f];
    

    是“静态类型”方法调用的示例,因为编译器很清楚应该使用哪种方法,因为 foobar 是静态类型的。

    现在考虑以下几点:

    id foobar = …;
    
    [foobar someMethod:42];
    

    由于foobar 具有类型id,这是通用的Objective-C 对象类型,编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,这可能很危险,具体取决于返回类型和参数类型之间的差异。这就是为什么 Apple 建议具有相同名称的方法也应该具有相同的签名。 Matt Gallagher 写了一篇关于the pitfalls of weak typing in Objective-C 的博文。

    【讨论】:

    • 啊...谢谢。谢谢你。然后只需要小心'id'类型变量,并且如果它们不“相关”并且具有相同的签名,则避免将两个方法命名为相同的名称。 PS:我真的应该注册,所以我可以投票。
    • @而且方法签名相同也没问题。如果方法名称相同但 不同 签名,则可能会出现问题。而且即使你没有将变量声明为id,也有几个框架方法的返回类型是id,所以你可能会在不知不觉中遇到麻烦。
    • 感谢您的警告。来自 Java,其中编译器尽其所能防止您自爆。这里松散的打字有点文化冲击。哈哈
    • 嗨,@Bavarious,还有一件事让我感到困惑,为什么即使对象是id,运行时也无法将方法绑定到正确的对象?据我了解,dynamic bindingdynamic typing 是编译器无法知道id 背后的对象,但运行时应该知道这一点并选择正确的对象作为消息的接收者。但是当运行时无法做到这一点时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2012-02-26
    • 2016-04-02
    相关资源
    最近更新 更多