Class bah = [NSString class];
id object = [bah new];
编译绝对没有问题。
Class<NSSecureCoding> bah = [NSString class];
id object = [bah new];
返回错误“选择器‘new’没有已知的类方法”。
为什么第一个实例明白它可以调用+new
在 NSObject 上定义了方法,但第二个实例没有?
根据苹果的文档:
协议不能用于类型化类对象。只有实例可以
静态类型化为协议,就像只有实例可以静态类型化一样
到一个班级。 (但是,在运行时,类和实例都会响应
符合协议:消息。)
这是来自旧文档的内容,但没有任何内容表明它已发生变化。但假设它仍然有效,基于此,你不应该做你正在做的事情。实例NSString
可能符合该协议,但你不应该说NSString
Class
对象符合它。
至于为什么它会给你这个错误,我相信这是因为当你指定协议时,它会报告不在该协议中的方法的错误。例如,以下给出一个错误:
Class<NSSecureCoding> bah = [NSString class];
id object = [bah class];
但以下内容将编译(尽管它给出了警告class
是实例方法,而不是类方法):
Class<NSObject> bah = [NSString class];
id object = [bah class];
你还会注意到new
没有定义在NSObject
协议,仅在NSObject
class.
所以当你只是指定Class
,编译器似乎会执行与您指定时类似的操作id
因为它不知道确切的类型,所以它可以让您从任何已知类型调用方法。但是当您向其中添加协议时,它只会让您调用该协议中的方法。
如果你想确保你分配给的任何内容bah
仅使用时符合特定协议Class
,您可以使用以下内容:
if ([bah conformsToProtocol:@protocol(NSSecureCoding)])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)