一个NSMethodSignature对象记录着某个方法的返回值类型信息以及参数类型信息。它用于转发消息接收者无法响应的消息。
可以通过methodSignatureForSelector:获取类方法或实例方法的签名;也可以用instanceMethodSignatureForSelector:获取实例方法的签名;
举个例子:
另外,发现:
只要返回值和参数类型都相同,那么不论方法名是否相同,都会返回同一个方法签名对象。
打印signature1对象:
根据打印,可知- (void)test:(NSString *)string的方法签名中包含了四种信息:
return value对应的type encoding为v
argument 0对应的type encoding为@
argument 1对应的type encoding为:
argument 2对应的type encoding为@
至于type encoding(类型编码)是什么,后面会讲到。
以上两个获取方法签名的方法都是从根类NSObject中继承而来的。还有一种手动创建方法签名的方式,如下:
即signatureWithObjeCTypes:,它是NSMethodSignature的类方法,参数为字符常量,那么这个参数传入的就是由上面打印的四种信息而组成。
然后创建好的NSMethodSignature对象会被用来创建NSInvocation对象,这个NSInvocation对象呢,就是作为消息转发中的最后一步:- (void)forwardInvocation:(NSInvocation *)anInvocation中的参数的。
默认情况下,如果一个对象无法响应某个消息,那么,调用NSObject的doesNotRecognizeSelector方法抛出异常。
有了消息转发机制,NSInvocation对象会利用NSMethodSignature对象中的信息,将消息进行封装,然后调用forwardInvocation方法将消息转发给消息的真正接收者。
Type Encoding
NSMethodSignature对象是根据字符串创建的,这里的字符串代表了某个方法的返回值类型以及参数类型的字符串编码。你可以使用编译器命令:encode()来获取特定类型的字符串编码。
一个方法签名包含代表方法返回值的一个或多个字符,后面跟上隐式参数self以及_cmd的字符串编码,然后后面再跟上零个或多个明确的参数的字符编码。可以通过methodReturnType属性获取返回值类型的字符编码,可以通过methodReturnLength属性获取返回值类型的长度。
例如:NSString的实例方法containsString:的方法签名包含以下参数:
1.返回值:BOOL类型, @encode(BOOL) ——c
2.方法接收者(self):id类型,@encode(id)——@
3.方法名(_cmd):SEL,@encode(SEL)——:
4.方法参数:NSString类型,@encode(NSString *)——@
网友评论