美文网首页
Type Encodings

Type Encodings

作者: CharmecarWang | 来源:发表于2020-03-01 17:15 被阅读0次

    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,这里面列了具体的对应关系

    相关文章

      网友评论

          本文标题:Type Encodings

          本文链接:https://www.haomeiwen.com/subject/uwxhkhtx.html