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

Jac*_*cko 38 protocols class objective-c objectfactory

我想将它用于对象工厂:给定一个字符串,创建一个Class,如果这个Class支持一个协议(使用Create()方法),那么分配该类并调用Create.

Chu*_*uck 268

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

  • 他在标题中问了两个问题:) (7认同)
  • 更进一步:`id <SomeProtocol> instance = [[class alloc] init]` (4认同)

BJ *_*mer 15

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}
Run Code Online (Sandbox Code Playgroud)

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

一个更好的选择是:

[[[klass alloc] init] create];
Run Code Online (Sandbox Code Playgroud)

但你似乎暗示你不想调用init.

你可以考虑一个类方法:[klass create]它将返回一个非拥有的实例klass.然后你[klass respondsToSelector:@selector(create)]在调用它之前先检查一下.