Objective C Memory Management with ARC
本问题已经有最佳答案,请猛点这里访问。
我对目标C不熟悉,我正在将旧(非ARC)框架的部分移植到ARC。我的问题是,尽管ARC现在在幕后处理了大量内存管理,但是否还有一些主要的内存管理原则需要我注意以避免泄漏?
例如,我想我在某个地方读到过,在nsoperation子类的"main"函数中,程序员应该为该函数设置一个"autoreleasepool"。
可能要注意的两个最大问题是1)保留周期,其中x保留y,y保留x,因此它们永远不会被释放。这通常发生在块上。2)当使用核心基础函数(核心图形等)时,例如:EDOCX1,0,EDCOX1,1,EDCOX1,2。在这些情况下,您仍然需要手动管理内存。
防止保留循环的常见模式是创建对循环中某个对象的弱引用。(经常是自我)。例如:
1 2 3 4 5 | __weak typeof(self) weakSelf = self; [self useBlock:^{ typeof(weakSelf) strongSelf = weakSelf; // do something with strongSelf }]; |
笔记:a)您希望在块内创建一个新的strongself的原因是为了确保在块的持续时间内保留weakself变量。否则,您可能会遇到这样的情况:weakself将在块中部分变为nil。在某些情况下,您可能希望添加一个strongself仍然立即存在的测试,如果不完全中止该块。因为在块开始之前,weakself可能会变成nil。
1 2 3 4 5 6 | __weak typeof(self) weakSelf = self; [self useBlock:^{ typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) return; // do something with strongSelf }]; |
b)您只需要在self将保留块时执行此操作(在这种情况下,通过未知的useblock方法执行)。
程序员仍然需要100%地了解RETAIN/RELEASE,但是编译器要完成98%的工作。它不能很好地完成的2%正在打破保留周期,因此编译器在属性中指定弱保留或在选择方案中使用弱保留修饰符很有帮助。
您也可以设置自己的@autoreleasepool's。我唯一有目的地使用它们的时间是作为for循环的主体,强制每次迭代都回收内存。