了解Objective-C重载时要注意一个问题

移动开发 iOS
本文介绍的是了解Objective-C下重载时要注意一个问题,相信大家对Objective-C已经很不陌生了,我们先来看详细内容。

了解Objective-C重载时要注意一个问题是本文要介绍的内容,不多说,直接进入话题,用ASyncSocket的来做一个简单TCP的客户端程序.很简单的程序。就是调AsyncSocket的ConnectToHost去联接服务器。

  1.     
  2. NSString * host = @"192.168.2.151";  
  3.      int port = 35000;  
  4.        
  5.      asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];   
  6.     NSError *err = nil;   
  7.  
  8.      
  9.     if(![asyncSocket connectToHost:host on:port error:&err])   
  10.     {   
  11.         NSLog(@"Error: %@", err);   
  12.     }  

整个程序可以编译运行。代码一运行到connectToHost就提示:

  1. *** -[AsyncSocket connectToHost:on:error:]:  
  2.  unrecognized selector sent to instance 0x3e6f250 2011-01-03 23:24:19.423 HelloiPhone[305:20b]   
  3.  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '   
  4.  *** -[AsyncSocket connectToHost:on:error:]: unrecognized selector sent to instance 0x3e6f250' 

在connectToHost里设了断点也无法进入。加了N多NSLog也不显示。阅读ASyncSocket.***突然灵光一现.是不是方法重载的问题?

因为原有的方法定义是

  1. - (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError **)errPtr; 

经过调整代码发现,主要是其参数符号onPort的原因。在方法定义时参数符号起注释作用,同时又是一个重载标志,在调用方法时,参数符号必须原封不动的写在调用方法之上。而我把onPort写成on,造成找不到相应的方法。
 
所以报错 unrecognized selector sent to 0x3e6f250。其中这个0x3e6f250就是asyncSocket这个类指针地址
因此简单修改如下代码,成功运行。

  1. NSString * host = @"192.168.2.151";  
  2.     unsigned short port = 35000;  
  3.        
  4.      asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];   
  5.     NSError *err = nil;   
  6.  
  7.      
  8.     if(![asyncSocket connectToHost:host onPort:port error:&err])   
  9.     {   
  10.         NSLog(@"Error: %@", err);   
  11.     } 

当你看到unrecognized selector sent to 这样的运行提示你的***个反应应该是对应的方法没有找到,如果是方法名写错一般在编译阶段即可发现。但是如果重载的方法,特别是参数符号错误的提示比较隐蔽。

不过一般的编译器也会有相应警告,事后仔细查看上述错误的编译时也会警告:

  1. warnning:'AsyncSocket' may be not respond to '-connectToHost:on:err'  

基本有这个警告你可以坐实是类方法没有找到原因

小结:了解Objective-C重载时要注意一个问题的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2012-07-04 14:40:37

Ajax

2011-08-05 15:56:03

Objective-C 消息 函数

2013-08-21 14:57:42

objective-c问题

2016-11-24 15:54:06

androidJSONObject

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-08-01 11:37:41

iPhone Objective- 内存

2011-07-22 15:10:51

Objective-C 文件

2017-02-13 16:47:13

iOSDSL开发

2011-08-02 15:55:31

Objective-C NSAutorele

2015-06-08 10:02:40

swiftOC兼容

2016-12-26 18:51:34

AndroidJavascriptJSONObject

2011-08-10 18:07:29

Objective-C反射

2011-05-11 11:20:26

Objective-C

2013-03-27 12:54:00

iOS开发Objective-C

2011-05-11 15:58:34

Objective-C

2013-06-20 10:40:32

Objective-C实现截图

2011-08-16 13:34:23

Objective-C归档

2011-07-22 15:42:39

Objective-C UIView 内存

2011-07-26 10:50:50

Objective-C Selector

2011-08-01 11:49:05

Objective-C
点赞
收藏

51CTO技术栈公众号