【问题标题】:ObjectiveC: something between return value and method name目标C:返回值和方法名之间的东西
【发布时间】:2024-04-23 15:25:02
【问题描述】:

我试图理解 objC 中方法名称之前的“某物”的含义。举个例子:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person 
                                property:(ABPropertyID)property 
                              identifier:(ABMultiValueIdentifier)identifier

方法名是shouldContinueAfterSelectingPerson,方法有三个参数,有一个返回值(BOOL),但是peoplePickerNavigationController:(ABPeoplePickerNavigationController *)的作用是什么?

不是返回值,也不是方法参数(因为在方法名之前),那又是什么呢?

【问题讨论】:

标签: objective-c syntax methods


【解决方案1】:

其实本例中方法名是

peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:

它有 4 个参数。

这是一种特殊情况,因为这是协议的一种方法。 一般来说,您不会调用/发送协议的方法,它们会被调用并且您应该实现它们以对特定情况做出适当的反应。

正如在其他答案中所说,您会得到peoplePickerNavigationController,因为您可能有各种控制器,并且您不想为所有控制器做同样的事情。 :) 你用它来区分它们。

如果您要自己调用此方法,那么第一个参数将是多余的(因为在大多数情况下您已经知道该信息)

希望对你有帮助。

【讨论】:

    【解决方案2】:

    在目标 c 中,该方法分为 4 个组件(或者我猜是我的看法)

    我将打破这个方法:

    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
          shouldContinueAfterSelectingPerson:(ABRecordRef)person 
                                    property:(ABPropertyID)property 
                                  identifier:(ABMultiValueIdentifier)identifier
    

    - 表示它是一个实例方法,你需要分配这个类的一个实例来使用它。

    (BOOL) 表示它应该返回BOOLYESNO

    方法由选择器 uid 定义,peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:

    这是完整的方法名称,与您所说的不同。

    最后一部分是参数。这些都是不言自明的。

    【讨论】:

    • 好吧,多说点Java这种方法有4个参数:peoplePicker、person、property和identifier。这是正确的吗?谢谢!
    • 是的,注意这些参数的类是在:之后的(Class)预先表示的
    【解决方案3】:

    不,方法名(或者严格来说,选择器)是

    peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:
    

    只是它的第一个参数是发送消息的导航控制器。这是为了让接收者知道是哪个对象发送了消息。它是委托方法的标准范例,因此一个对象可以委托给多个其他对象。

    【讨论】:

      【解决方案4】:

      假设您是在“笼统地”谈论这种方法,而不是专门谈论这种方法。

      嗯,这都是方法签名的一部分。每个部分前面有一个冒号 (:) 是一个字符串,它是有效的方法名称的所有部分。

      【讨论】:

        【解决方案5】:

        方法名称是peoplePickerNavigationController,而不是“shouldContinueAfterSelectingPerson”。实际上,方法的签名是peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:,因为在Objective-C 中方法名称/签名是由所有参数组成的。

        【讨论】:

        • 好吧,也许现在我明白了。方法名称是 peoplePickerNavigationController 并且 shouldContinueAfterSelectingPerson 是四个参数之一。这是正确的吗?谢谢!
        • 方法名称peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:签名 是完全不同的东西。在 Obj-C 中,它描述了返回值和参数的类型。 @用户
        【解决方案6】:

        方法名不是shouldContinueAfterSelectingPerson而是peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:,它有4个参数。

        【讨论】:

          【解决方案7】:

          peoplePickerNavigationController: 参数的作用是允许多个 ABPeoplePickerNavigationController 对象使用您对象的单个实例作为委托。

          这样,如果有多个 ABPeoplePickerNavigationController 对象,您将知道哪个选择器进行了选择(并调用了您的委托方法)。

          希望这有助于消除您的困惑!

          【讨论】: