Class bah = [NSString class];
id object = [bah new];
编译时无任何问题。
Class<NSSecureCoding> bah = [NSString class];
id object = [bah new];
返回错误信息"No known class method for selector 'new'"。
为什么第一个实例可以调用NSObject定义的
+new
方法,而第二个实例不能?涉及到技术细节,请参阅相关技术文档。Class bah = [NSString class];
id object = [bah new];
编译时无任何问题。
Class<NSSecureCoding> bah = [NSString class];
id object = [bah new];
+new
方法,而第二个实例不能?涉及到技术细节,请参阅相关技术文档。Class<NSSecureCoding> bah = [NSString class];
id object = [bah class];
class
是一个实例方法而不是类方法):Class<NSObject> bah = [NSString class];
id object = [bah class];
您会注意到在NSObject
协议中未定义new
,只有在NSObject
类中定义了它。
因此,当您仅指定Class
时,编译器似乎会执行与指定id
类似的操作,即它不知道确切的类型,因此将允许您从任何已知类型调用方法。但是,当您向其添加协议时,它只允许您从该协议调用方法。
如果您想要确保分配给bah
的任何内容符合特定协议而仅使用Class
,则可以使用以下内容:
if ([bah conformsToProtocol:@protocol(NSSecureCoding)])
Class<NSSecureCoding>
是一个对象,响应协议NSSecureCoding
的类方法。协议NSSecureCoding
没有声明方法+new
,因此您无法调用它。
Class<AnyProcol> = [NSString class]
对于任何协议都可以编译而不会出现警告。- 参见http://lists.cs.uiuc.edu/pipermail/llvmbugs/2013-March/027464.html。 - Martin R