Type Encodings
在使用消息轉(zhuǎn)發(fā)的時(shí)候入蛆,我們經(jīng)常會(huì)用到到這個(gè)方法methodSignatureForSelector
:
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
if (self.target == nil)
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
return [self.target methodSignatureForSelector:selector];
}
該方法用來返回方法簽名,即方法的返回值和參數(shù)惶室。
那這里的v@:@
是什么意思呢劲装?
在OC中方法調(diào)用,又稱為向一個(gè)對(duì)象發(fā)送消息啊终,比如:
[receiver message]
編譯后就是這個(gè)樣子:
objc_msgSend(receiver, selector)
objc_msgSend
方法的文檔:
id objc_msgSend(id self, SEL op, ...)
參數(shù):
- self 消息的接收者
- op 消息的selector
- … 消息傳入?yún)?shù)的數(shù)組
這里的 “v@:@”就代表:
"v":代表返回值void疑苔,其實(shí)就對(duì)應(yīng)著objc_msgSend的返回值
"@":代表一個(gè)id類型的對(duì)象甫匹,也就是消息的receiver
":":代表SEL
"@":代表參數(shù),該參數(shù)是個(gè)id類型對(duì)象
再看一個(gè)例子
- (BOOL)hasLoadData:(NSString *)url
其ObjCTypes為:"B@:@":
- "B":代表返回值是BOOL
- "@":代表一個(gè)id類型的對(duì)象夯巷,也就是消息的receiver
- ":":代表SEL
- "@":代表參數(shù)赛惩,該參數(shù)是個(gè)id類型對(duì)象哀墓,也就是url
那么我們是怎么確定這個(gè)ObjCTypes的呢趁餐?
- 通過encode() 函數(shù),// NSLog(@"%s",@encode(BOOL))的結(jié)果為B
- 看官方文檔Type Encodings篮绰,這里面列了具體的對(duì)應(yīng)關(guān)系