了解Objective-C重載時要注意一個問題
了解Objective-C下重載時要注意一個問題是本文要介紹的內容,不多說,直接進入話題,用ASyncSocket的來做一個簡單TCP的客戶端程序.很簡單的程序。就是調AsyncSocket的ConnectToHost去聯接服務器。
- NSString * host = @"192.168.2.151";
- int port = 35000;
- asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];
- NSError *err = nil;
- if(![asyncSocket connectToHost:host on:port error:&err])
- {
- NSLog(@"Error: %@", err);
- }
整個程序可以編譯運行。代碼一運行到connectToHost就提示:
- *** -[AsyncSocket connectToHost:on:error:]:
- unrecognized selector sent to instance 0x3e6f250 2011-01-03 23:24:19.423 HelloiPhone[305:20b]
- *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '
- *** -[AsyncSocket connectToHost:on:error:]: unrecognized selector sent to instance 0x3e6f250'
在connectToHost里設了斷點也無法進入。加了N多NSLog也不顯示。閱讀ASyncSocket.***突然靈光一現.是不是方法重載的問題?
因為原有的方法定義是
- - (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError **)errPtr;
經過調整代碼發現,主要是其參數符號onPort的原因。在方法定義時參數符號起注釋作用,同時又是一個重載標志,在調用方法時,參數符號必須原封不動的寫在調用方法之上。而我把onPort寫成on,造成找不到相應的方法。
所以報錯 unrecognized selector sent to 0x3e6f250。其中這個0x3e6f250就是asyncSocket這個類指針地址
因此簡單修改如下代碼,成功運行。
- NSString * host = @"192.168.2.151";
- unsigned short port = 35000;
- asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];
- NSError *err = nil;
- if(![asyncSocket connectToHost:host onPort:port error:&err])
- {
- NSLog(@"Error: %@", err);
- }
當你看到unrecognized selector sent to 這樣的運行提示你的***個反應應該是對應的方法沒有找到,如果是方法名寫錯一般在編譯階段即可發現。但是如果重載的方法,特別是參數符號錯誤的提示比較隱蔽。
不過一般的編譯器也會有相應警告,事后仔細查看上述錯誤的編譯時也會警告:
- warnning:'AsyncSocket' may be not respond to '-connectToHost:on:err'
基本有這個警告你可以坐實是類方法沒有找到原因
小結:了解Objective-C下重載時要注意一個問題的內容介紹完了,希望本文對你有所幫助!