Memory management 即使使用ARC,仪器中的内存也会不断增加
我正在创建一个仅启用ARC和iOS 7的应用程序。我的所有属性都正确地标记为弱,所有强变量在我需要的地方都标记为nil 当我用仪器运行我的应用程序时,我发现内存分配在不断增加。当我进入任何屏幕时,内存都会增加(大约2MB)。当我弹出该视图时,内存降到只有几KBs。我不知道发生了什么 在弹出视图时,我使用以下命令: 更新: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
[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];
}];
\uu弱id
创建了一个弱指针,所以我不会创建一个重周期。
但还有一个问题,如果对象没有其他可用的引用,它将被解除分配,弱
引用将为零,并可能导致崩溃因此,好的做法是创建块中弱侧的强引用,并检查nil。您能显示块中的吗。。。?您可能正在引用不应该引用的对象,并且它保留了一些对象。。。若你们正在访问块中的self,请在进入块中之前创建指向self的弱指针。是的,你们应该对侧块中的任何强指针进行弱引用。但若对象被解除分配,则弱指针可能为nil,所以在使用它之前,请在块内对弱指针进行强引用并检查是否为nil。对于dictionary,如果其实例变量或属性为yes,如果其方法为local,则使用block运算符,如果其in-side block,则按原样使用。可能要将此添加到您的答案中。更具体地说,如何在使用块时避免强引用循环。尽管你的回答很好地涵盖了这一点@C_X我使用的所有IBOutlet都定义为
@property(非原子,弱)IBOutlet iVarName代码>因此这将不会被已经很弱的块保留。。我说得对吗?