在阅读@encoding的Objective-C手册时,我发现了一些不熟悉的东西。
Table 6-2 Objective-C method encodings
Code Meaning
r const
n in
N inout
o out
O bycopy
R byref
V oneway我唯一知道的就是oneway。其他的是什么?
发布于 2011-04-10 12:58:03
这些是分布式对象使用的方法参数和返回值的注释。我之所以这么说,是因为很明显,在苹果的文档中再也看不到他们的身影了。Objective-C编程语言文档中曾经有一个远程消息传递部分,它仍然被分布式对象编程主题文档引用。
指针参数仅为输入参数且不会被引用later
NSDistantObject,使用代理对象传递或返回object
发布于 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将向函数中添加一个临时的自动释放变量传递(用于一致性):
原始代码
NSError *error;
[obj executeWithError:&error];伪变换代码
NSError * __strong error;
NSError * __autoreleasing temp;
temp = error;
[obj executeWithError:&temp];
error = temp;使用上面的代码,如果我们以某种方式知道temp永远不会被读取,那么temp = error行将是不必要的。这就是out注解发挥作用的地方。根据引用的描述,如果out丢失,编译器必须添加行temp = error,但是如果它包含out,它可以排除该行,并使代码更小/更快。使用out,转换后的代码变成:
NSError * __strong error;
NSError * __autoreleasing temp;
[obj executeWithError:&temp];
error = temp;当然,如果你那么担心二进制文件的大小和速度,你应该只编写以下代码:
NSError * __autoreleasing error;
[obj executeWithError:&error];完全有可能在整个编译器和运行时的其他地方使用这些注释,并且将来可能会在更多的地方使用。就我个人而言,我喜欢使用out作为对其他开发人员的一个提示,我不打算读取它的值。
发布于 2012-01-25 21:30:30
如果有人偶然发现了这篇文章,并且和我有同样的困惑,'in‘参数也可以是一个表示快速枚举的关键字。有关更多详细信息,请参阅here。
https://stackoverflow.com/questions/5609564
复制相似问题