【问题标题】:How ARC works when using third library code?使用第三个库代码时 ARC 是如何工作的?
【发布时间】:2012-06-21 04:34:28
【问题描述】:

我正在阅读与 ARC 相关的文章。以下是该部分:

ARC 还利用了 Objective-C 语言命名约定和 推断返回对象的所有权。在 Objective-C 中,一个方法 具有以下任一前缀的统计信息

  1. 分配,
  2. 复制,
  3. 可变复制
  4. 和新的

被认为是转让所有权 返回对象给调用者。这意味着,在您的应用程序中,当 你创建一个方法,ARC会自动推断是否返回一个 autoreleased 对象或方法名称中的 +1 保留对象。但是,有一个小警告。假设您有一个 以“copy”开头的方法,如

-(NSString*) copyRightString;

ARC 假设它会将返回的字符串的所有权转移给调用者并插入一个释放 自动地。如果调用的方法和 调用方法是使用 ARC 编译的。

但是如果你的 “copyRightString” 方法位于第三方库中 使用 ARC 编译,您将过度释放返回的字符串。这是 因为,在调用代码上,ARC 编译器会插入一个发布到 平衡“复制”方法增加的保留计数。

相反,如果第三方库是使用 ARC 编译的,而您的 方法不是,你会有内存泄漏。

现在我有两个问题: 1.为什么“copyRightString”方法在非ARC编译的第三方库中时会过度释放对象?由于方法名以copy开头,所以方法不会释放对象,因为它是调用方法的责任释放 ARC 将处理的对象,因为方法的名称以 copy 开头。

2.第三方库用ARC编译为什么会出现内存泄漏? 方法不是吗?由于方法名以copy开头,所以ARC不会释放它,它是调用方法来释放它的责任。在我们的代码中,我们将释放它,因为方法名以copy开头。

我希望我清楚!

【问题讨论】:

  • 是的,当然可以。但是你能回答我的问题吗?
  • 除非你彻底改进它,否则没人会:)
  • 如果我得到要求的答案,那么我肯定会接受它。现在如果我得到要求的答案,我会接受它。
  • 希望现在有人回答。

标签: iphone objective-c automatic-ref-counting


【解决方案1】:

在此示例中,选择方法名称-copyRightString 是为了显示某个问题。方法签名表明该方法返回一个包含版权信息的字符串,因此程序员会期望它返回一个自动发布的值。但意外地方法名称以copy 开头,因此 ARC 期望它返回一个保留值。方法实现可能如下所示:

- (NSString *)copyRightString
{
   return [NSString stringWithFormat:@"Copyright %d %@", 
                                     self.copyRightYear,
                                     self.companyName];
}

如果您在没有 ARC 的第三方库中编译此方法,该方法将返回一个自动释放的值。如果您现在从 ARC 代码中使用它,ARC 会看到名称以 copy 开头,因此它希望此方法返回一个保留的(不是​​自动释放的)值。因此,它会过于频繁地释放返回值一次。这就是过度发布的部分。

另一方面,如果使用 ARC 编译此方法,ARC 会看到名称以 copy 开头,因此它会确保该方法返回一个保留值。然而,从非 ARC 使用此方法的程序员可能期望该方法返回一个自动释放的值(因为方法签名表明它返回一个包含版权信息的字符串)。所以他们不会在代码中释放对象,从而导致内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多