iOS内存未发布,后台线程

时间:2012-07-19 23:47:41

标签: ios xcode memory

我有两个视图控制器,一个带有按钮网格,第二个是基于用户按下的按钮的详细描述。

我正在使用“仪器分配”工具中的“Mark Heap”,并在用户看到详细的View Controller然后按导航栏中的后退按钮后发现我的应用程序内存正在增加。 IT应该导致内存净变为零......我正在使用ARC,xcode 4.2.1,部署到ios 5.0 +

按下按钮后加载新的ViewController时,我会在后台线程中加载一些数据图像。是否有可能因为我快速按下后退按钮,该数据仍在后台线程中加载并且永远不会从内存中释放?

1 个答案:

答案 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不存在),一切都很好!