编辑
我发现我的屏幕不会为零,因为它们保留了 RefCt 但我的问题是为什么 RefCt 不是 0?我只是创建、添加和删除视图。还添加了仪器的屏幕转储:
所以你一开始就看到
Malloc 1 initwithframe,retain:2 initwithframe,release:1 -[UIView(Internal) _addSubview:positioned:relativeTo:],retain:2 Quartzcore CALAyer layoutSublayers,retain:3 Quartzcore CALAyer layoutSublayers,release:2 然后在我的代码中删除这个查看,removeFromSuperView:1
有人可以解释一下吗:
-[UIView(Internal) _addSubview:positioned:relativeTo:], retain : 2
线?我认为这就是为什么我的观点仍然有一个 RefCt。
结尾
我试图清理我的代码并最终加速我的应用程序,但我不认为我真的得到了整个内存管理的东西。基本上,我的应用程序有一个对用户可见的视图,但它可以根据用户在菜单中选择的内容切换到不同的视图。现在我认为最符合逻辑的是一次只分配一个视图并占用内存空间,当用户选择另一个视图时,应该释放当前视图并分配所选视图。在选择新视图时,我尝试通过执行以下操作来创建它:
- (void)removeMenus {
@autoreleasepool {
for (UIView *view in container.subviews) {
NSLog(@"View to be removed: %@", view);
[view removeFromSuperview];
}
}
}
假设用户选择再次显示开始屏幕。这段代码将运行:
- (void)createStartScreen {
if (startScreen == nil) {
startScreen = [[StartScreen alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
startScreen.delegate = self;
startScreen.layer.shadowColor = [[UIColor blackColor] CGColor];
startScreen.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
startScreen.layer.shadowRadius = 5.0f;
startScreen.layer.shadowOpacity = 1.0f;
}
}
我在那里放了一个断点,发现 startscreen 不是 nil ,而我认为应该是因为我从 superview 中删除了它(也尝试删除该 var 的指针)。如果我理解正确,startscreen 的保留计数不为零,对吗?我也在使用 ARC,所以我认为 ARC 会很好地处理这个问题。
释放用户不再可见的视图以保留内存的正确方法是什么?