Objective-C中的程序化对象创建

时间:2013-05-14 16:23:09

标签: objective-c object initialization implementation alloc

下面有两种方法可以以编程方式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)如果是这样,它是否被编程为最佳状态?是否有我忽视的捷径或最佳实践?

1 个答案:

答案 0 :(得分:2)

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

如果满足以下任何条件,则无需使用详细版本:

  • 您仅使用-initWithType:而非-initWithType:
  • 您确定您实例化的每个课程都能够处理-initWithType:
  • 如果您实例化的类没有响应buildObject
  • ,您不介意应用程序意外退出未知方法异常

此版本(尽管您应将nil设置为nil以显式处理错误情况)如果找不到类或者它没有响应-initWithType:,则返回nil 。如果找不到类,则简洁版返回-initWithType:,如果类实例没有响应{{1}},则抛出异常。