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

W.K*_*K.S 1 json objective-c ios nsjsonserialization

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

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

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

-(instancetype) initWithData:(NSData *) json error: (NSError **) error;
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

虽然这在语法上是完全可行的,但这种方法在功能方面会有问题.

问题是,当初始化程序的调用不成功并nil返回时,仍然会分配对象的空间(然后立即释放),因为您无法控制它.的通话alloc

MyObj *obj = [[MyObj alloc] initWithData:data error:&err];
Run Code Online (Sandbox Code Playgroud)

发生在您的代码之外.

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

+(instancetype) myclassWithData:(NSData *) json error: (NSError **) error;
Run Code Online (Sandbox Code Playgroud)

这样您就可以决定何时调用alloc,因此当您确定没有要创建的对象时,就不会有无用的内存分配/释放.

  • @ gnasher729请指出我答案中的一个地方,我说它不起作用或者它是错的(提示:我没有).在写一篇负面评论之前,**阅读**答案通常是个好主意. (3认同)