我是Objective C的新手,我正在将旧的(非ARC)框架的一部分移植到ARC。我的问题是,虽然ARC现在在后台处理大量的内存管理,但是为了避免泄漏,我还需要注意哪些主要的内存管理原则?
例如我以为我读过某个地方,在NSOperation子类的'main'函数中,程序员应该为该函数设置'autoreleasepool'。
答案 0 :(得分:2)
可能需要注意的两个最大问题是1)保留周期,其中x保留y和y保留x因此它们永远不会被释放。这通常发生在块上。 2)使用Core Foundation功能(核心图形等)时,例如:CGImageCreate
,CGImageRetain
,CGImageRelease
。在这些情况下,您仍需要手动管理内存。
防止保留周期的常见模式是创建对周期中某个对象的弱引用。 (通常是自我)。比如这个:
__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循环的主体,强制每次迭代回收内存。