我有两个视图控制器,一个带有按钮网格,第二个是基于用户按下的按钮的详细描述。
我正在使用“仪器分配”工具中的“Mark Heap”,并在用户看到详细的View Controller然后按导航栏中的后退按钮后发现我的应用程序内存正在增加。 IT应该导致内存净变为零......我正在使用ARC,xcode 4.2.1,部署到ios 5.0 +
按下按钮后加载新的ViewController时,我会在后台线程中加载一些数据图像。是否有可能因为我快速按下后退按钮,该数据仍在后台线程中加载并且永远不会从内存中释放?
答案 0 :(得分:0)
来自我所描述的记忆周期问题的类中的幻灯片:
如果你有一个类的以下属性怎么办?
@property (strong, nonatomic) NSArray* myBlocks; // array of blocks
然后尝试在该类的方法之一中执行以下操作?
[self.myBlocks addObject:^() {
[self doSomething];
}];
只要块有效,块内引用的所有对象都将保留在堆中。 (换句话说,块保持一个强大的指针指向它们内部引用的所有对象。)
在这种情况下,self是此块中引用的对象。因此该块将具有指向self的强指针。但请注意,self也有一个指向块的强指针(通过myBlocks proeprty)
这是一个严重的问题!
现在,自我和块都无法逃脱堆。那是因为总会有一个强大的指针指向它们(彼此的指针)。这被称为记忆“循环”。
溶液:
局部变量总是很强大。没关系,因为当它们超出范围时,它们会消失,所以强指针会消失。但有一种方法可以声明局部变量很弱。这是怎么......
__weak MyClass* weakSelf = self;
[self.myBlocks addObject:^{
[weakSelf doSomething];
}];
这解决了这个问题,因为现在块只有一个指向self的弱指针。 (self仍然有一个强大的指向阻塞的指针,但这没关系)只要一个人在一个univese中有一个强大的指向这个自我的指针,那么该块的指针是好的。并且由于如果self不存在,块将不存在(因为myBlocks不存在),一切都很好!