2

我有两个代码:

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

我很好奇为什么会这样?

4

1 回答 1

1

Class类型表示一个 Objective-C 类(它是一个 C 结构)。请参阅此处的运行时文档。

只有a 的定义Class才能符合协议(您可以使用class_conformsToProtocolor NSObject'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)是否响应它们,否则应用程序将崩溃。

于 2013-08-16T13:15:42.213 回答