如何使用ARC第三库代码时的作品?(How ARC works when using third l

2019-10-16 21:13发布

我在读文章与有关ARC.Following是部分:

ARC还充分利用到了Objective-C语言的命名约定并推断返回的对象的所有权。 在Objective-C,一种方法,用下面的前缀中的任何一个统计

  1. ALLOC,
  2. 复制,
  3. mutableCopy

被认为是转移返回对象的所有权给调用者。 这意味着,在您的应用程序,当你创建一个方法,ARC自动推断是否返回一个自动释放的对象或从你的方法名+1保留的对象。 然而,有一个>小的警告。 让我们假设你有一个与“复制”开头的方法,如

- (的NSString *)copyRightString;

ARC假定它会返回字符串的所有权转移给调用者,并自动插入释放。 一切正常,如果同时被调用方法和调用的方法使用ARC编译。

但是,如果你的“copyRightString”的方法是在不与ARC编译的第三方库,你会过度释放返回的字符串。 这是因为,调用代码,ARC编译器插入释放,以平衡由“复制”的方法颠簸保留计数。

相反,如果第三方库编译与ARC和你的方法是不是,你将有一个内存泄漏。

现在,我有两个问题:1.为什么对象是过度释放时“copyRightString”的方法是在不与ARC编译的第三方库由于方法名以开始复制,因此该方法不会释放,因为它的对象?在调用方法来释放它,因为方法的名称与副本开始ARC将照顾对象的责任。

2.为什么会出现内存泄漏如果第三方库的编译与ARC,我们的方法是不是?因为方法的名称与副本开始,这样ARC不会释放它,它是调用方法来释放it.and在我们的责任代码我们将发布它,因为那么方法名称开头的副本。

我希望我清楚!

Answer 1:

在这个例子中,该方法名-copyRightString被选择表现出一定的问题。 该方法的签名表明,该方法返回一个包含版权信息的字符串,所以程序员期望它返回一个自动释放的值。 但意外的方法名称以copy ,所以ARC预计它返回一个残值。 方法实现看起来是这样的:

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

如果你在没有ARC第三方库编译此方法,该方法将返回一个自动释放价值。 如果你现在从ARC代码中使用它,ARC认为该名称以copy ,所以,预计这个方法返回一个保留(不自动释放)值。 正因为如此,它会释放返回值一个时间过于频繁。 这是过度释放部分。

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



文章来源: How ARC works when using third library code?