gpt4 book ai didi

ios - 以下 iOS 代码安全吗? (__autoreleasing 语义)

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:30 25 4
gpt4 key购买 nike

-(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];

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

最佳答案

根据 the clang ARC spec ,形式为 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;

It's actually slightly more complicated than that如果输出参数被标记为 out,但它通常是这样工作的。

关于ios - 以下 iOS 代码安全吗? (__autoreleasing 语义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15487096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com