由于在自动引用计数的项目中, NSString * aString;
意味着隐式NSString * __strong aString;
。是否还会计入参数并返回类型?
时
- (NSString *)doubleString:(NSString *)aString {
return [NSString stringWithFormat:@"%@%@", aString, aString];
}
与
相同的编译代码- (NSString * __strong)doubleString:(NSString * __strong)aString {
return [NSString stringWithFormat:@"%@%@", aString, aString];
}
以及每种类似的方法?
答案 0 :(得分:3)
简答:是的。两种变体都可以生成相同的编译代码,可以进行验证 通过Xcode菜单中的“Product - > Perform Action ... - > Assemble ...”。
更长的答案 :(以下引用和引用来自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];
}
但我无法找到明确的参考资料。