【发布时间】:2011-01-21 15:03:55
【问题描述】:
我想将它用于对象工厂:给定一个字符串,创建一个类,如果 该类支持协议(使用 Create() 方法)然后分配该类并调用 创建。
【问题讨论】:
标签: objective-c class protocols objectfactory
我想将它用于对象工厂:给定一个字符串,创建一个类,如果 该类支持协议(使用 Create() 方法)然后分配该类并调用 创建。
【问题讨论】:
标签: objective-c class protocols objectfactory
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)]。
【讨论】:
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}
【讨论】:
id<SomeProtocol> instance = [[class alloc] init]