【问题标题】:Method signature in Objective-CObjective-C 中的方法签名
【发布时间】:2014-11-05 08:17:27
【问题描述】:

我试图理解,Objective-C 中的方法签名是什么样子的。

简介:

首先,让我们打破对问题的误解,它是什么,方法签名? 方法签名是帮助编译器明确识别子程序的东西。 我对吗? :)

所以在C语言中签名大致等价于它的原型定义: 例如,我们在 stdlib 中有函数 int printf( const char *format, ... );。 这个函数的签名是printf。 在这种情况下,我们不能在 C 语言中重载,因为编译器无法识别具有不同参数类型的函数,所以人们决定做一些棘手的事情:

long int labs (long int n);
int      abs  (int n);
double   fabs (double x);

在 C++ 语言中,方法签名是类名、方法名和方法参数。 所以在这种语言中我们可以重载方法。

问题

我无法得到简单的答案,Objective-C 中的方法签名是什么?! 我正在尝试使用我的逻辑...

1)首先,我们不能在 Objective-C 中重载 => 方法参数不是方法签名的一部分。

2)我尝试编译不同返回值的代码:

@interface Foo : NSObject
- (CGFloat)method;
- (NSInteger)method;
@end

在这种情况下我得到了错误 => 返回值不是方法签名的一部分。


我测试了不同的案例并得到了答案,Objective-C 中的方法签名是类名、方法类型('+' 或'-')和选择器。 例如,我们在 Foo 类中有方法(代码如下):

@interface Foo : NSObject
+ (void)methodWithArgument:(NSInteger)argument;
@end

所以这个方法的签名是+[Foo methodWithArgument:]

然后,我查看了苹果的 NSMethodSignature (http://bit.ly/1tGR8zt) 文档

NSMethodSignature 对象记录参数的类型信息 以及方法的返回值

参数和返回值?!只有使用参数和返回值,我们才能明确识别方法?很奇怪。

【问题讨论】:

    标签: ios objective-c method-signature


    【解决方案1】:

    第一件事。谁说编译器可以根据返回类型区分两种方法

    所以

    @interface Foo : NSObject
    - (CGFloat)method;
    - (NSInteger)method;
    @end
    

    错了。即使在 C 或 C++ 中,您也不能根据返回类型重载方法。可以根据参数类型或方法的参数数量或两者都执行重载。

    所以只能通过这种方式进行超载

    @interface Foo : NSObject
    -(ReturnType)methodNameHere:(int)argument;
    -(ReturnType)methodNameHere:(int)argument secondArgumentDescription:(BOOL)anotherArgument;
    -(ReturnType)methodNameHere;
    

    编译器根据参数数量及其数据类型识别不同的方法

    【讨论】:

      【解决方案2】:

      方法签名适用于开发人员和运行时,
      不适用于编译器。 (编译器使用另一种技术来理解签名)

      【讨论】:

        【解决方案3】:

        您无法识别具有相同名称但返回类型不同的方法。如果在丢弃返回值的同时调用它,应该调用哪一个?

        @interface Foo : NSObject
        - (CGFloat)method;
        - (NSInteger)method;
        @end
        
        Foo *foo = [Foo new];
        [foo method]; // no use for return value here. Which implementation to call?
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 2012-02-26
          • 2012-02-07
          • 2011-01-18
          • 1970-01-01
          相关资源
          最近更新 更多