【问题标题】:How memory gets released when using ARC?使用 ARC 时如何释放内存?
【发布时间】:2012-06-18 15:31:38
【问题描述】:

我正在阅读有关 ARC 的文档,遇到了一个让我感到困惑的部分。请任何人帮助我。 我有两个问题: 1.当没有变量指向它时,我知道ARC释放对象。现在假设我有一些方法说:(NSString *)returnString,其返回类型是NSSTring;那么在returnString方法中声明的变量会发生什么?我知道接收变量会在超出调用 returnString 的方法的范围时被释放,但是 returnString 内部的变量会发生什么。

-(NSSTring *)returnString
{
   NSString *str = //Some value;

   return str;//What will happen to this.
}

和 其他方法:

-(void)useString
{
   NSString *str1 = [self returnString];  //It will get release when this method gets over.
}

2.如果returnString在一些第三方库中没有ARC编译会怎样?

【问题讨论】:

    标签: iphone automatic-ref-counting


    【解决方案1】:

    ARC 只是在编译时插入 [... retain][... release] 方法调用。在您的情况下,它看到 'str' 是一个局部变量,并在您的声明之后添加一个 autorelease 方法调用。实际上,内存以同样的方式被释放,但您不必担心,ARC 会为您完成。

    【讨论】:

    • 一旦添加了-retain-release-autorelease,编译器确实会检查并优化代码,因此可以再次删除许多添加的代码,即使是跨调用也是如此。自动释放池中的对象会少很多。
    【解决方案2】:

    对于您的第一个问题,ARC 将负责为您保留和释放。每当您仍在维护对变量的引用时,ARC 都应该保留它。在您的具体示例中,字符串可能会作为自动释放对象返回,但实际实现对您隐藏。

    对于第二个问题,您可以将库标记为不使用 ARC,以保持手动保留/释放。为此,请参阅以下问题:ios5 ARC what is the compiler flag to exclude a file from ARC?

    【讨论】:

    • 感谢您的回复。我得到了第一个答案。但是对于您要说的第二个问题,我需要在第二种情况下手动自动释放 str 吗?
    • 如果一个文件被标记为“-fno-objc-arc”,那么你仍然需要手动retain/release/autorelease。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2012-05-22
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多