Objective-C in,out,inout,byref,byval,..等等,他们是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

在阅读Objective-C手册时,我发现了一些不熟悉的东西@encoding

Table 6-2  Objective-C method encodings
Code Meaning
r    const
n    in
N    inout
o    out
O    bycopy
R    byref
V    oneway
提问于
用户回答回答于

这些是分布式对象使用的方法参数和返回值的注释。我说因为显然苹果公司的文档中没有任何迹象。Objective-C编程语言文档中曾经有一个远程消息传递部分,它仍然被分布式对象编程主题文档引用:

  • in:参数只是输入参数,不会在稍后引用
  • out:参数只是一个输出参数,用于通过引用返回一个值
  • inout:参数既是输入参数又是输出参数
  • const:(指针)参数是常量
  • bycopy:代替使用代理/ NSDistantObject,传递或返回对象的副本
  • byref:使用代理对象(默认)
用户回答回答于

我通过回写传递给out参数的过程中遇到了以下内容:

如果该参数不是标记的Objective-C方法参数out,则读取该参数*p,并使用原语语义将结果写入临时文件。

这与类似的方法有关- (BOOL)executeWithError:(out NSError **)error

忽略out关键字,ARC具有将引用对象传递为as的明确行为__autoreleasing,因此ARC将该error参数视为具有类型NSError * __autoreleasing *。如果您使用其他限定的变量,ARC会在函数中添加一个临时的自动释放变量传递:

原始代码:

NSError *error;
[obj executeWithError:&error];

伪转换的代码:

NSError * __strong error;
NSError * __autoreleasing temp;
temp = error;
[obj executeWithError:&temp];
error = temp;

通过上面的代码则可以排除该行并使代码稍微更小/更快。随着out转换后的代码变成:

NSError * __strong error;
NSError * __autoreleasing temp;
[obj executeWithError:&temp];
error = temp;

当然,如果你担心二进制大小和速度,你应该编码如下:

NSError * __autoreleasing error;
[obj executeWithError:&error];

扫码关注云+社区

领取腾讯云代金券