我有两个代码:
for(Class<ContactV2Storage> tmpClass in config->ctxStorageClasses){
id<ContactV2Storage> stor = [[[tmpClass alloc] init] autorelease];
}
和
for(Class tmpClass in config->ctxStorageClasses){
id<ContactV2Storage> stor = [[[tmpClass alloc] init] autorelease];
}
两者的工作方式相同,但在使用第一个版本(我认为更好)时,编译器会给我一个警告:
Class method '+alloc' not found (return type defaults to 'id')
我很好奇为什么会这样?
答案 0 :(得分:1)
Class
类型表示Objective-C类(它是C结构)。请参阅运行时文档here。
只有Class
的定义符合协议(您可以查看class_conformsToProtocol
或NSObject
&#39; s conformsToProtocol:
)。因此,使用Class<ContactV2Storage>
时,您的第一段代码不正确。
第二部分大多是正确的,但更安全的方法是:
for(Class tmpClass in config->ctxStorageClasses) {
if([tmpClass conformsToProtocol:@protocol(ContactV2Storage)]) {
id<ContactV2Storage> stor = [[[tmpClass alloc] init] autorelease];
// do stuffs
}
}
通过这种方式,您确定要实例化的类符合协议,并且可以安全地接收您发送的任何消息。如果协议中的任何方法都是可选的,您还应该检查实例化对象(在本例中为stor
)在调用它们之前对它们做出响应,否则应用程序将崩溃。