我想将它用于对象工厂:给定一个字符串,创建一个Class,如果 此类支持协议(使用Create()方法)然后分配类和调用 创建
答案 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)]
。