Memory management 即使使用ARC,仪器中的内存也会不断增加

Memory management 即使使用ARC,仪器中的内存也会不断增加,memory-management,ios7,automatic-ref-counting,Memory Management,Ios7,Automatic Ref Counting,我正在创建一个仅启用ARC和iOS 7的应用程序。我的所有属性都正确地标记为弱,所有强变量在我需要的地方都标记为nil 当我用仪器运行我的应用程序时,我发现内存分配在不断增加。当我进入任何屏幕时,内存都会增加(大约2MB)。当我弹出该视图时,内存降到只有几KBs。我不知道发生了什么 在弹出视图时,我使用以下命令: 更新: [UIView animateWithDuration:0.5 animations:^{ CGRect newFrame = aSideMenu.view.f

我正在创建一个仅启用ARC和iOS 7的应用程序。我的所有属性都正确地标记为弱,所有强变量在我需要的地方都标记为nil

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

在弹出视图时,我使用以下命令:

更新:

[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];
}];
这里我在块中使用
aSideMenu
<代码>aSideMenu是强变量。你认为我需要创建它的弱引用和使用

__weak id aWeak = aSideMenu;
用这个aWeak而不是aSideMenu

在我使用的几个街区中:

 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:....nil];
我是否也应该传递“dict”的弱引用

我不确定这是否是原因。请帮我追踪这个问题。另外,如果需要在这个问题中添加其他内容以更好地解决问题,请告诉我


谢谢

如果您也粘贴代码,那就太好了。没有代码,我可以给你一些提示。 就像永远不要试图访问块中self的强指针一样。在进入一个块之前,创建self的弱指针

__weak id weakSelf = self;
然后在块内使用
weakSelf

更好的方法是测试你的应用程序是否有无限的内存增长,如果分配的内存永远没有机会释放,你可以使用分配工具来记录内存占用

更新:

[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];
}];
  • 是的,因为您正在强指针上调用setter方法,所以它将保留它。如果它们是共享的,你必须使它们变弱或阻塞。

  • 在编写了更多的代码之后,我想更清楚地说明块中的引用。 当您引用块内的某个强指针时,可能会出现内存问题,因为块不会让它们解除锁定,因为它们具有有效引用,这是内存问题的主要原因。为此,我们使用
    \uu弱id
    创建了一个弱指针,所以我不会创建一个重周期。 但还有一个问题,如果对象没有其他可用的引用,它将被解除分配,
    引用将为零,并可能导致崩溃


  • 因此,好的做法是创建块中弱侧的强引用,并检查nil。

    您能显示块中的吗。。。?您可能正在引用不应该引用的对象,并且它保留了一些对象。。。若你们正在访问块中的self,请在进入块中之前创建指向self的弱指针。是的,你们应该对侧块中的任何强指针进行弱引用。但若对象被解除分配,则弱指针可能为nil,所以在使用它之前,请在块内对弱指针进行强引用并检查是否为nil。对于dictionary,如果其实例变量或属性为yes,如果其方法为local,则使用block运算符,如果其in-side block,则按原样使用。可能要将此添加到您的答案中。更具体地说,如何在使用块时避免强引用循环。尽管你的回答很好地涵盖了这一点@C_X我使用的所有IBOutlet都定义为
    @property(非原子,弱)IBOutlet iVarName因此这将不会被已经很弱的块保留。。我说得对吗?