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模拟器。
任何帮助表示赞赏!非常感谢你!
答案 0 :(得分:1)
是的,如果某个其他对象具有方法签名并响应该方法,则方法可以在没有方法签名的情况下运行。基本上,你偶然发现了一个实现细节。 NSString实际上并不响应initWithBytes:length:encoding:
,你可以通过询问它来发现:
SEL selector1 = @selector(initWithBytes:length:encoding:);
NSLog(@"%d", [[NSString class] instancesRespondToSelector:selector1]); // 0
对于你不应该知道的其他类的辅助对象,可能是forwarded dynamically。您可以在自己的代码中使用相同的功能。