参数/返回类型的隐式所有权限定符始终是__strong?

时间:2014-01-05 14:11:40

标签: objective-c parameters automatic-ref-counting return-type ownership

由于在自动引用计数的项目中, 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];
}

以及每种类似的方法?

1 个答案:

答案 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];
}

但我无法找到明确的参考资料。