当使用alloc时,为什么Class <type>会产生warning和Class not,init </type>

时间:2013-07-05 11:13:33

标签: objective-c alloc

我有两个代码:

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')

我很好奇为什么会这样?

1 个答案:

答案 0 :(得分:1)

Class类型表示Objective-C类(它是C结构)。请参阅运行时文档here

只有Class定义符合协议(您可以查看class_conformsToProtocolNSObject&#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)在调用它们之前对它们做出响应,否则应用程序将崩溃。