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 对象记录方法的参数和返回值的类型信息
参数和返回值?!仅使用参数和返回值,我们就可以明确识别方法?这很奇怪。
第一件事。谁说编译器可以根据其返回类型或它的返回类型来区分两种方法
所以
@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)
编译器根据参数数量及其数据类型识别不同的方法
| 归档时间: |
|
| 查看次数: |
4367 次 |
| 最近记录: |