Type Encodings
在使用消息转发的时候,我们经常会用到到这个方法methodSignatureForSelector
:
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
if (self.target == nil)
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
return [self.target methodSignatureForSelector:selector];
}
该方法用来返回方法签名,即方法的返回值和参数。
那这里的v@:@
是什么意思呢?
在OC中方法调用,又称为向一个对象发送消息,比如:
[receiver message]
编译后就是这个样子:
objc_msgSend(receiver, selector)
objc_msgSend
方法的文档:
id objc_msgSend(id self, SEL op, ...)
参数:
- self 消息的接收者
- op 消息的selector
- … 消息传入参数的数组
这里的 “v@:@”就代表:
"v":代表返回值void,其实就对应着objc_msgSend的返回值
"@":代表一个id类型的对象,也就是消息的receiver
":":代表SEL
"@":代表参数,该参数是个id类型对象
再看一个例子
- (BOOL)hasLoadData:(NSString *)url
其ObjCTypes为:"B@:@":
- "B":代表返回值是BOOL
- "@":代表一个id类型的对象,也就是消息的receiver
- ":":代表SEL
- "@":代表参数,该参数是个id类型对象,也就是url
那么我们是怎么确定这个ObjCTypes的呢?
- 通过encode() 函数,// NSLog(@"%s",@encode(BOOL))的结果为B
- 看官方文档Type Encodings,这里面列了具体的对应关系
网友评论