阅读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
我唯一知道的是 oneway
,其他的有哪些?
阅读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
我唯一知道的是 oneway
,其他的有哪些?
这些是分布式对象使用的方法参数和返回值注释。我说“使用过”,因为显然在苹果的文档中已经没有它们的踪迹了。以前在Objective-C编程语言文档中有一个远程消息传递部分,现在仍然被分布式对象编程主题文档引用。
NSDistantObject
,而是传递或返回对象的副本out
,则会读取*p
,并使用基本语义将结果写入临时变量。”- (BOOL)executeWithError:(out NSError **)error
这样的方法有关。out
关键字,ARC有一个明确定义的行为,将按引用对象传递视为__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
作为向其他开发人员暗示我不会读取该值的提示。”executeWithError:&error];
- eonil
UIScrollViewDelegate
方法中使用了inout
(targetContentOffset:(inout CGPoint *)targetContentOffset
)。这就是我来这里的原因。 - Mazyod