简短回答: 是的。两种变体都产生相同的编译代码,可以验证
通过 Xcode 菜单中的“产品 -> 执行操作... -> 组装 ...”。
更长的答案:(以下参考文献和引文来自Clang/ARC 文档。)
您关于返回值的问题。根据
"4 Ownership qualification",
__strong 和 __weak 之类的限定符适用于 内存中的位置,其中指针
存储到一个对象,并且它们在从加载或存储到时指定语义
左值 (4.2 Semantics)。
方法的返回值不是内存中的这样一个位置(它不是一个左值),
因此所有权资格的概念在这里不适用。
方法声明为返回(NSString * __weak)或(NSString * __strong)没有区别,编译后的代码没有区别。
一个稍微不同的问题是调用者是否拥有
返回对象(它有一个 +1 保留计数)与否。默认情况下,这取决于方法名称,如"3.2.2 Retained return values" 中所述
和"3.2.3 Unretained return values"。
您关于参数的问题。 将参数声明为
(NSString * __strong) 与 (NSString *) 相同。这已经可以看到
来自 Xcode 自动补全(未显示“__strong”限定符),但是
也来自生成的汇编代码。
这并不意味着在调用方法时参数会保留。
默认情况下,它们不是,如中所述
"3.2 Retainable object pointers as operands and arguments".
如果一个参数被声明为__weak,它似乎(来自汇编代码)在方法中创建了一个临时弱引用,即
- (NSString *) doubleString:(NSString * __weak)aString {
return [NSString stringWithFormat:@"%@%@", aString, aString];
}
本质上是一样的
- (NSString *) doubleString:(NSString *)aString {
NSString *__weak wString = aString;
return [NSString stringWithFormat:@"%@%@", wString, wString];
}
但我无法找到明确的参考。