我可以在Objective-C中将NSError **作为参数包含在init中吗?

时间:2015-01-02 12:25:43

标签: ios objective-c json nsjsonserialization

我的iOS应用程序从REST服务中获取JSON。 JSON包含状态代码和数据。 如果代码是200,则数据是请求的对象,否则数据是错误描述。

JSON可用于构建多种对象,因此我创建了一个工厂类,它在构造函数中获取json数据,实例方法根据需要将数据解析为不同的对象。

我的问题是,如果状态代码不是200,可以在构造函数中包含NSError **作为参数。方法标题看起来像这样:

-(instancetype) initWithData:(NSData *) json error: (NSError **) error;

3 个答案:

答案 0 :(得分:5)

虽然这在句法上非常合适,但这种方法在功能方面会有问题。

问题在于,当初始化程序的调用不成功并且返回nil时,仍然会分配对象的空间(然后立即释放),因为您无法控制它。 <{1}}在

中的调用
alloc

发生在您的代码之外。

最好从调用者隐藏初始化程序,并公开类“工厂”方法,如下所示:

MyObj *obj = [[MyObj alloc] initWithData:data error:&err];

这样你可以决定何时调用+(instancetype) myclassWithData:(NSData *) json error: (NSError **) error; ,因此当你确定没有要创建的对象时,就没有无用的内存分配/释放。

答案 1 :(得分:1)

当然,这可能是不寻常的,因为我不记得在init中使用它的任何iOS API,但它并没有错......

答案 2 :(得分:1)

没关系。我这么做了很多次。考虑到在Objective-C对象构造中没有语言特性,而是框架的一部分。因此初始化器不是特殊方法。初始化程序的唯一特例是它们使用self并转移返回值的所有权。但这与out参数无关。

这很不寻常,因为初始化程序通常无法破解。所以通常你根本就不需要它。