【发布时间】:2013-06-18 11:26:54
【问题描述】:
编辑
我发现我的屏幕不会为零,因为它们保留了 RefCt,但我的问题是为什么 RefCt 不是 0?我只是创建、添加和删除视图。还添加了仪器的屏幕转储:
所以你在开头看到
Malloc 1 initwithframe,保留:2 initwithframe,发布:1 -[UIView(内部)_addSubview:positioned:relativeTo:],保留:2 Quartzcore CALAyer layoutSublayers,retain: 3 Quartzcore CALAyer layoutSublayers,发布: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 可以很好地处理这个问题。
释放用户不再可见的视图以保留内存的正确方法是什么?
【问题讨论】:
标签: objective-c memory-management automatic-ref-counting release-management retaincount