2014-01-09 62 views
1

我创建的应用程序仅支持ARC和iOS 7。我的所有属性都被正确标记为弱,并且所有强变量在我需要的地方标记为零。即使使用ARC,内存也不断增加仪器使用

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

而坡平我使用以下的图:

UPDATE:

[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]; 

我应该通过'快译通”太多的弱引用?

我不确定这是否是原因。请帮我跟踪这个问题。此外,让我知道是否有其他需要添加在这个问题更好的解决方案。

谢谢

+0

你可以显示哪个在这个块内?你有可能引用哪一个不应该,并且它保留了一些对象......如果你正在访问自己,那么在进入块之前,让自己创建指向自己的弱指针。 –

+0

是的,你应该对side block中的强指针做弱引用。但是,如果对象被释放,弱指针可能为零,因此在使用它之前,请强烈引用块内的弱指针并检查零。对于字典,如果它的实例变量或属性是yes,如果它的方法是局部的,则使用块运算符,如果它在方块中则按照原样使用它。 –

回答

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引用,还有另一个问题,它将被释放,并且引用将为零,并且可能导致崩溃。

所以,最好的做法是创建一个强大的参考,以弱的方块和检查为零。

+0

可能要添加到您的答案。更具体地说明在使用块时如何避免强参考周期。尽管你的回答很好。 https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html – Freddy

+0

好的补充... –

+0

@C_X感谢您的回复,请检查我更新的问题.. –

相关问题