即使使用ARC,仪器内存也会不断增加

时间:2014-01-09 12:45:28

标签: memory-management ios7 automatic-ref-counting

我正在创建一个启用了ARC且仅支持iOS 7的应用程序。我的所有属性都被正确标记为弱,所有强变量都标记为nil,我需要它。

当我使用Instruments运行我的应用程序时,我发现内存分配不断增加。当我进入任何屏幕时,内存增加(大约2 MB)。当我弹出该视图时,内存下降到只有几KB。我不知道发生了什么。

在弹出我正在使用的视图时:

更新

[UIView animateWithDuration:0.5 animations:^{
        CGRect newFrame = aSideMenu.view.frame;
        newFrame.origin = SIDE_MENU_VIEW_ORIGIN_FINAL;
        [aSideMenu.view setFrame:newFrame];
    } completion:^(BOOL finished) {
        [sender setUserInteractionEnabled:YES];
}];

我在块中使用aSideMenuaSideMenu是强大的变量。你认为我需要创建它的弱引用并使用吗?

__weak id aWeak = aSideMenu;

并使用此aWeak而不是aSideMenu?

同样在我使用的几个街区中:

 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:....nil];

我是否应该通过“dict”的弱引用?

我不确定这是不是这个原因。请帮我跟踪一下这个问题。另请告诉我是否需要在此问题中添加任何其他内容以获得更好的解决方案。

由于

1 个答案:

答案 0 :(得分:1)

如果您粘贴代码也会很棒。没有代码,我可以给你一些提示。 就像从来没有尝试在块中访问自我的强指针。在进入块之前创建自我的弱指针。

__weak id weakSelf = self;

然后在块内使用weakSelf

最好还测试你的应用程序是否有无限的内存增长,分配的内存永远不会有机会解除分配,你可以通过使用分配工具来占用足迹。

<强>更新

  1. 是因为你在强指针上调用setter方法,它会保留它。如果共享它们,你必须使它们__weak或__block。 https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1

  2. 在获得更多代码后,我想更清楚地了解块中的引用。 当你在块中引用一些强指针时,内存问题可能会出现,因为块不会让它们解析,因为它们有有效的引用,这是内存问题的主要原因。为此,我们使用__weak id创建了一个弱指针,因此我不会创建一个retian循环。 但是如果对象没有其他vaild引用,还有另一个问题,它将被释放,weak引用将为nil并且可能导致崩溃。

  3. 好的做法是在块中创建一个强弱的弱引用并检查nil。