我的iOS应用程序从REST服务中获取JSON。 JSON包含状态代码和数据。 如果代码是200,则数据是请求的对象,否则数据是错误描述。
JSON可用于构建多种对象,因此我创建了一个工厂类,它在构造函数中获取json数据,实例方法根据需要将数据解析为不同的对象。
我的问题是,如果状态代码不是200,可以在构造函数中包含NSError **作为参数。方法标题看起来像这样:
-(instancetype) initWithData:(NSData *) json error: (NSError **) error;
答案 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参数无关。
这很不寻常,因为初始化程序通常无法破解。所以通常你根本就不需要它。