下面有两种方法可以以编程方式alloc
和init
各种类别的对象和'类型'。
- (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)如果是这样,它是否被编程为最佳状态?是否有我忽视的捷径或最佳实践?
答案 0 :(得分:2)
此方法的详细版本和简洁版本之间的区别在于详细版本验证类实例可以实际响应-initWithType:
,而NSObject
不是标准的-init
初始化函数。
如果满足以下任何条件,则无需使用详细版本:
-initWithType:
而非-initWithType:
-initWithType:
buildObject
此版本(尽管您应将nil
设置为nil以显式处理错误情况)如果找不到类或者它没有响应-initWithType:
,则返回nil
。如果找不到类,则简洁版返回-initWithType:
,如果类实例没有响应{{1}},则抛出异常。