0

下面有两种以编程方式allocinit各种类和“类型”的对象的方法。

- (id)buildObjectOfClass:(NSString *)classString andType:(NSString *)typeString
    {
    id buildObject;
    Class className             = NSClassFromString(classString);
    SEL initWithTypeSelector    = NSSelectorFromString(@"initWithType:");

    if ([className instancesRespondToSelector:initWithTypeSelector] == YES) {
        buildObject = [[className alloc] performSelector:initWithTypeSelector 
                                              withObject: typeString];
    }
    return buildObject;
}

这个方法实现最初写得更简洁:
{ return [[className alloc] initWithType:typeString]; }

我的问题是:1)冗长的版本是必要的吗?2) 如果是这样,它是否已尽可能地进行了编程?是否有我忽略的捷径或最佳实践?

4

1 回答 1

2

此方法的详细版本和简洁版本之间的区别在于,详细版本验证类实例实际上可以响应-initWithType:不是标准的NSObjectinit 函数。

如果以下任何一项为真,则无需使用详细版本:

  • 你只是在使用-init而不是-initWithType:
  • 您确定您实例化的每个类都将能够处理-initWithType:
  • 如果您实例化的类没有响应,您不介意应用程序意外退出并出现未知方法异常-initWithType:

如果找不到buildObject该类nil或它不响应-initWithType:. 如果找不到类,则简洁版本返回nil,如果类实例不响应,则抛出异常-initWithType:

于 2013-05-14T16:38:26.153 回答