Objective-C 方法重载 - Selector 标识起决定作用
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
重载方法声明:
- (void)test; - (void)test:(NSString *)command; - (NSString *)test:(NSString *)command param:(NSString *)param; - (NSString *)test:(NSString *)command param:(NSString *)param result:(NSString *)result; - (NSString *)test:(NSString *)command result:(NSString *)result param:(NSString *)param; - (NSString *)test:(NSString *)command :(NSString *)result :(NSString *)param; - (NSString *)test:(NSString *)command param:(NSString *)param callback:(NSString *)callback;
以上每个方法的实现中,都加入这一句,用于打印当前方法的签名:
NSLog(@"%@", NSStringFromSelector(_cmd));
按如下顺序调用以上各方法:
[interface test]; [interface test:@"command"]; [interface test:@"command" param:@"param"]; [interface test:@"command" param:@"param" result:@"result"]; [interface test:@"command" result:@"result" param:@"param"]; [interface test:@"command" :@"result" :@"param"]; [interface test:@"command" param:@"param" callback:@"callback"];
输出结果如下:
2015-02-28 12:14:02.724 TestWebView[1490:371780] test 2015-02-28 12:14:02.724 TestWebView[1490:371780] test: 2015-02-28 12:14:02.724 TestWebView[1490:371780] test:param: 2015-02-28 12:14:02.724 TestWebView[1490:371780] test:param:result: 2015-02-28 12:14:02.725 TestWebView[1490:371780] test:result:param: 2015-02-28 12:14:02.725 TestWebView[1490:371780] test::: 2015-02-28 12:14:02.725 TestWebView[1490:371780] test:param:callback:
由下图 XCode 的错误提示可知,数据类型不能用于区分重载方法:
由下图 XCode 的错误提示可知,冒号前的参数名是用于区分方法签名的依据,形参名和数据类型一样,并不起作用,这源于 selector 的构成要素是冒前前的部分:
由此可以总结:
1、参数个数决定了方法的签名;
2、相同参数个数的方法,参数名用于区分重载
3、数据类型和形参名不能用于区分方法
4、selector 的构成要素决定了,冒号前的部分所构成的方法签名用于区分方法