我想将其用于对象工厂:给定一个字符串,创建一个类,如果该类支持协议(使用 Create() 方法),则分配该类并调用 Create。
问问题
21426 次
2 回答
271
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}
于 2010-02-26T20:53:39.417 回答
15
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
但是,我可以指出您通过执行上述操作违反了多少可怕的 Objective-C 规则吗?例如,您永远不应该在已分配但未初始化的实例上调用方法。Xcode 静态分析器会给你各种关于内存泄漏的警告。
更好的选择是:
[[[klass alloc] init] create];
但是您似乎暗示您不想调用init。
您可以考虑一个类方法:[klass create]
,它将返回 的非拥有实例klass
。然后,您只需[klass respondsToSelector:@selector(create)]
在调用它之前进行检查。
于 2010-02-26T20:47:59.490 回答