Objective-C 中的方法签名

nik*_*ils -1 objective-c method-signature ios

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

介绍:

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

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

long int labs (long int n);
int      abs  (int n);
double   fabs (double x);
Run Code Online (Sandbox Code Playgroud)

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

问题

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

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

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

@interface Foo : NSObject
- (CGFloat)method;
- (NSInteger)method;
@end
Run Code Online (Sandbox Code Playgroud)

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


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

@interface Foo : NSObject
+ (void)methodWithArgument:(NSInteger)argument;
@end
Run Code Online (Sandbox Code Playgroud)

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

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

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

参数和返回值?!仅使用参数和返回值,我们就可以明确识别方法?这很奇怪。

Vai*_*tam 5

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

所以

@interface Foo : NSObject
- (CGFloat)method;
- (NSInteger)method;
@end
Run Code Online (Sandbox Code Playgroud)

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

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

@interface Foo : NSObject
-(ReturnType)methodNameHere:(int)argument;
-(ReturnType)methodNameHere:(int)argument secondArgumentDescription:(BOOL)anotherArgument;
-(ReturnType)methodNameHere;
Run Code Online (Sandbox Code Playgroud)

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