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

Can I include NSError** as a parameter in init in Objective-C?

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

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

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

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

当然,这可能不寻常,因为我不记得有任何 iOS API 在 init 中执行此操作,但这并没有错...

虽然这在语法上完全没问题,但这种方法在功能方面会有问题。

问题是当初始化器调用不成功返回nil时,对象的space仍然被分配(然后迅速释放),因为你没有控制权超过它。

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

发生在您的代码之外。

您最好对调用者隐藏初始化程序,并公开 class "factory" 方法,如下所示:

+(instancetype) myclassWithData:(NSData *) json error: (NSError **) error;

这样你就可以决定什么时候调用alloc,所以当你确定没有要创建的对象时,就不会有无用的内存分配/释放。

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

这很不寻常,因为初始化程序通常不会中断。所以通常你根本不需要它。