2
-(NSData *)jsonRepresentation:(NSError **error)error {
   NSDictionary *dict = [self getDictRepresentation];
   return [NSJSONSerialization dataWithJSONObject:dict options:nil error:error];
}

// Some other place...

NSError *__autoreleasing error = nil;
NSData *json = [obj jsonRepresentation:&error];

自动释放语义是否安全地将error堆栈传送到我的第二个代码块?

4

2 回答 2

5

根据clang ARC 规范,形式的方法参数NSError **(或者更确切地说,指向任何 obj-c 对象的指针)被隐式假定为NSError * __autoreleasing *. 这意味着错误将在方法中自动释放。

至于调用站点,如果您使用__autoreleasing变量调用它,那么一切都很好。事实上,我推荐这种模式。但是,如果您__strong改为使用变量调用它,它仍然可以工作。在这种情况下,编译器将生成一个未命名的__autoreleasing临时文件,将其地址传递给方法,然后在返回时,将临时文件分配给__strong. 所以如果你有

NSError *foo;
[bar callMethodWithError:&foo];

编译器会将其视为

NSError *foo;
NSError * __autoreleasing tmp = foo;
[bar callMethodWithError:&tmp];
foo = tmp;

它实际上比标记 out-param稍微复杂一些out,但这通常是它的工作方式。

于 2013-03-18T21:22:29.237 回答
3

是的,它是正确的,但是你应该在方法声明中指定这个修饰符,而不是在变量的声明中。甚至 Apple 的官方文档也明确提到了这种情况:

__autoreleasing用于表示通过引用 ( id *) 传递并在返回时自动释放的参数。

于 2013-03-18T21:20:00.737 回答