iOS内存未释放,后台线程

iOS内存未释放,后台线程,ios,xcode,memory,Ios,Xcode,Memory,我有两个视图控制器,一个带有按钮网格,第二个是基于用户按下的按钮的详细描述 我正在使用Instruments allocations tool中的“Mark Heap”,发现在用户看到详细视图控制器并按下导航栏中的后退按钮后,我的应用程序的内存正在增加。它将导致内存的净变化为零。。。我正在使用ARC,xcode 4.2.1,部署到ios 5.0+ 按下按钮后加载新的ViewController时,会在后台线程中加载一些数据图像。有没有可能因为我正在快速按下“后退”按钮,所以数据仍在后台线程中加载

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

我正在使用Instruments allocations tool中的“Mark Heap”,发现在用户看到详细视图控制器并按下导航栏中的后退按钮后,我的应用程序的内存正在增加。它将导致内存的净变化为零。。。我正在使用ARC,xcode 4.2.1,部署到ios 5.0+


按下按钮后加载新的ViewController时,会在后台线程中加载一些数据图像。有没有可能因为我正在快速按下“后退”按钮,所以数据仍在后台线程中加载,并且从未从内存中释放?

来自我所上的课程的幻灯片,其中描述了您可能面临的内存周期问题:

如果你有一个类的以下属性呢

@property (strong, nonatomic) NSArray* myBlocks;    // array of blocks
然后尝试在该类的某个方法中执行以下操作

[self.myBlocks addObject:^() {
    [self doSomething];
}];
块中引用的所有对象都将在堆中保留,直到块停止为止。(换句话说,块保持一个指向其内部引用的所有对象的强指针。)

在这种情况下,self是此块中引用的对象。因此,块将具有指向self的强指针。但请注意,self也有一个指向块的强指针(通过其myBlocks proepty)

这是一个严重的问题

现在,self和block都无法逃离堆。这是因为总会有一个指向它们两个的强指针(对方的指针)。这被称为内存“循环”

解决方案:

局部变量总是强的。没关系,因为当它们超出范围时,它们就会消失,所以强指针就会消失。但是有一种方法可以声明局部变量是弱的。以下是如何

__weak MyClass* weakSelf = self;
[self.myBlocks addObject:^{
    [weakSelf doSomething];
}];

这解决了问题,因为现在块只有一个指向self的弱指针。(self仍然有一个指向block的强指针,但这没关系)只要大学里有人有一个指向这个self的强指针,block的指针就是好的。如果self不存在,那么块就不存在(因为myBlocks不存在),一切都很好

您可能希望提供更多的代码;根据您提供的描述很难诊断。如果您认为原因可能是在后台线程中加载图像(可能是这样),请尝试将加载图像的代码放置在主线程中,然后查看问题是否仍然存在。在后台线程中运行的代码必须释放内存,您是在后台线程结束时还是在任何其他时刻这样做?你正在加载多少图像?在后台线程中加载图像听起来不对;通常,您希望将长时间运行的任务或cpu智能任务放在单独的线程中,该线程应负责/管理其请求的任何内存。谢谢!在我的代码中,我没有在任何地方使用块——您是否碰巧有另一个关于何时会出现此类问题的示例?基本上,我在UIView中添加了很多子视图,并且在这些子视图中添加了很多子视图。这会产生同样的强指针问题吗?再次感谢,这里描述的问题主要是关于块的,我想我假设你指的是块,因为你的主题行提到了背景线程。如果您还有两个其他对象具有指向另一个对象的强内存指针,而它们不在代码中可以释放或设置为nil的位置,则可能会发生内存周期。通常,如果视图中包含子视图和子视图,则描述的是单向情况,而不太可能。但是,如果您有视图控制器,它们之间有来回的指针,那么这种可能性就更大。