2013-05-14 119 views
0

下面有两种编程方式来编程allocinit各种类和'类型'的对象。
Objective-C中编程对象的创建

- (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

你能解释一下这个*为什么吗?我无法想象我会想要做这件事的一个例子。你通过从字符串构建类和选择器来打开自己的大量错误/崩溃。 – 2013-05-14 16:30:11

回答

2

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

没有必要使用详细的版本如有以下是真实的:

  • 你只使用-init而不是-initWithType:
  • 你确信你每次实例化类将能够处理-initWithType:
  • 你不介意与未知方法例外意外退出应用程序,如果你实例化类并不-initWithType:
回应

此版本(尽管您应该将buildObject设置为零以明确处理错误情况)如果未找到该类或者它不响应-initWithType:,则返回nil。如果找不到该类,则简化版本会返回nil,如果类实例不响应-initWithType:,则会引发异常。

+0

当在ARC下编译时,只有'respondsToSelector:'检查失败_only_时,long版本返回'nil'。否则它会返回垃圾。 – 2013-05-14 18:25:57

+0

@JoshCaswell我相信我在最后一段的开头提到了这个事实。 – gaige 2013-05-14 18:48:26

+0

我直接回复。那句话对我来说就好像你在说'如果实例不响应'initWithType:','buildObject'将始终为'nil'。如果ARC未启用,则不是这样。 – 2013-05-14 18:51:12