首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C in,out,inout,byref,byval,.诸若此类。他们是什么?

Objective-C in,out,inout,byref,byval,.诸若此类。他们是什么?
EN

Stack Overflow用户
提问于 2011-04-10 11:23:37
回答 4查看 16.6K关注 0票数 65

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

代码语言:javascript
复制
Table 6-2  Objective-C method encodings
Code Meaning
r    const
n    in
N    inout
o    out
O    bycopy
R    byref
V    oneway

我唯一知道的就是oneway。其他的是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-10 12:58:03

这些是分布式对象使用的方法参数和返回值的注释。我之所以这么说,是因为很明显,在苹果的文档中再也看不到他们的身影了。Objective-C编程语言文档中曾经有一个远程消息传递部分,它仍然被分布式对象编程主题文档引用。

指针参数仅为输入参数且不会被引用later

  • out:参数仅为输出参数,用于通过reference

  • inout:参数返回值同时是输入和输出argument

  • const: (指针)参数为constant

  • bycopy:而不是使用代理/NSDistantObject,使用代理对象传递或返回object

  • byref:的副本(默认)
票数 87
EN

Stack Overflow用户

发布于 2013-09-24 06:49:21

除了分布式对象之外,ARC似乎还在使用这些注释之一。在clang对passing to an out parameter by writeback的描述中,我偶然发现了以下内容

如果参数不是标记为out的Objective-C方法参数,则读取*p,并将结果写入具有原始语义的临时。

这与像- (BOOL)executeWithError:(out NSError **)error这样的方法有关。

忽略out关键字,ARC具有well-defined behavior of treating by-reference object passing as __autoreleasing,因此ARC将error参数视为具有NSError * __autoreleasing *类型。如果您使用其他限定变量,ARC将向函数中添加一个临时的自动释放变量传递(用于一致性):

原始代码

代码语言:javascript
复制
NSError *error;
[obj executeWithError:&error];

伪变换代码

代码语言:javascript
复制
NSError * __strong error;
NSError * __autoreleasing temp;
temp = error;
[obj executeWithError:&temp];
error = temp;

使用上面的代码,如果我们以某种方式知道temp永远不会被读取,那么temp = error行将是不必要的。这就是out注解发挥作用的地方。根据引用的描述,如果out丢失,编译器必须添加行temp = error,但是如果它包含out,它可以排除该行,并使代码更小/更快。使用out,转换后的代码变成:

代码语言:javascript
复制
NSError * __strong error;
NSError * __autoreleasing temp;
[obj executeWithError:&temp];
error = temp;

当然,如果你那么担心二进制文件的大小和速度,你应该只编写以下代码:

代码语言:javascript
复制
NSError * __autoreleasing error;
[obj executeWithError:&error];

完全有可能在整个编译器和运行时的其他地方使用这些注释,并且将来可能会在更多的地方使用。就我个人而言,我喜欢使用out作为对其他开发人员的一个提示,我不打算读取它的值。

票数 27
EN

Stack Overflow用户

发布于 2012-01-25 21:30:30

如果有人偶然发现了这篇文章,并且和我有同样的困惑,'in‘参数也可以是一个表示快速枚举的关键字。有关更多详细信息,请参阅here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5609564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档