对instanceMethodSignatureForSelector的调用返回nil。为什么?

时间:2014-12-24 01:39:22

标签: ios objective-c iphone

NSString的头文件具有如下函数声明:

- (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;    

这是演示代码。

SEL selector1 = @selector(initWithBytes:length:encoding:);    
NSLog(@"%@", [NSString instanceMethodSignatureForSelector:selector1]);    
NSLog(@"%@", [[NSString new] methodSignatureForSelector:selector1]);    

但两个结果都是:( null)。为什么?任何函数都可以在没有MethodSignature的情况下运行吗?

环境:XCode6.2 Beta。 iPhone模拟器。

任何帮助表示赞赏!非常感谢你!

1 个答案:

答案 0 :(得分:1)

是的,如果某个其他对象具有方法签名并响应该方法,则方法可以在没有方法签名的情况下运行。基本上,你偶然发现了一个实现细节。 NSString实际上并不响应initWithBytes:length:encoding:,你可以通过询问它来发现:

SEL selector1 = @selector(initWithBytes:length:encoding:);
NSLog(@"%d", [[NSString class] instancesRespondToSelector:selector1]); // 0

对于你不应该知道的其他类的辅助对象,可能是forwarded dynamically。您可以在自己的代码中使用相同的功能。