目标C:给定一个类ID,我可以检查这个类是否实现了某个协议?或者有一个选择器?

时间:2010-02-26 20:39:54

标签: objective-c class protocols objectfactory

我想将它用于对象工厂:给定一个字符串,创建一个Class,如果 此类支持协议(使用Create()方法)然后分配类和调用 创建

2 个答案:

答案 0 :(得分:263)

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}

答案 1 :(得分:15)

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

但是,我是否可以通过上述方法指出你破坏了多少糟糕的Objective-C规则?例如,您永远不应该在已分配但未初始化的实例上调用方法。 Xcode静态分析器将为您提供有关内存泄漏的各种警告。

更好的选择是:

[[[klass alloc] init] create];

但你似乎暗示你不想打电话给初学者。

您可以考虑一种类方法:[klass create],它将返回klass的非拥有实例。然后,您只需在调用之前检查[klass respondsToSelector:@selector(create)]