Objective C使用ARC进行内存管理

时间:2014-02-18 02:53:41

标签: objective-c memory-management automatic-ref-counting

我是Objective C的新手,我正在将旧的(非ARC)框架的一部分移植到ARC。我的问题是,虽然ARC现在在后台处理大量的内存管理,但是为了避免泄漏,我还需要注意哪些主要的内存管理原则?

例如我以为我读过某个地方,在NSOperation子类的'main'函数中,程序员应该为该函数设置'autoreleasepool'。

2 个答案:

答案 0 :(得分:2)

可能需要注意的两个最大问题是1)保留周期,其中x保留y和y保留x因此它们永远不会被释放。这通常发生在块上。 2)使用Core Foundation功能(核心图形等)时,例如:CGImageCreateCGImageRetainCGImageRelease。在这些情况下,您仍需要手动管理内存。

防止保留周期的常见模式是创建对周期中某个对象的弱引用。 (通常是自我)。比如这个:

__weak typeof(self) weakSelf = self;
[self useBlock:^{
    typeof(weakSelf) strongSelf = weakSelf;
    // do something with strongSelf
}];

注意: a)你想在块内创建一个新的strongSelf的原因是为了确保你在块的持续时间内保留weakSelf变量。否则,你可能会遇到这样的情况,即weakSelf将在块中成为零。在某些情况下,您可能希望添加一个即时存在strongSelf的测试,如果不是完全中止该块。因为在块开始之前,弱自己可能会变为零。

__weak typeof(self) weakSelf = self;
[self useBlock:^{
    typeof(weakSelf) strongSelf = weakSelf;
    if (!strongSelf) return;
    // do something with strongSelf
}];

b)你只需要在self保留块时执行此操作(在这种情况下,通过未知的useBlock方法正在执行的操作)。

答案 1 :(得分:1)

程序员仍然需要100%了解保留/释放,但是,编译器正在完成98%的工作。 2%它不能很好地打破保留周期,因此编译器在属性中指定弱保留或在选择的场景中使用__weak修饰符是有帮助的。

您也可以设置自己的@ autoreleasepool。我有目的地使用它们的唯一一次是/作为for循环的主体,强制每次迭代回收内存。