(^。^)对不起,我的英语不好。
嗨我有下一个问题我创建2个按钮第一个按钮创建一个视图控制器并将他的视图添加到其他viewcontroller第二个按钮我释放创建的视图控制器并从父视图中删除视图。 如果我点击更快,2个按钮会崩溃,就像帖子标题中的消息一样,这就是代码
(我现在这是因为内存问题但问题是什么?我这样做只是为了看看XCODE-PROFIL-INSTRUMENTS-Allocations的内存管理请帮助):
- (IBAction)create:(id)sender{
vc = nil;
vc = [[[VC alloc] initWithNibName:@"VC" bundle:[NSBundle mainBundle]] retain];
[_VW addSubview:vc.view];
}
用这个按钮杀死:
- (IBAction)kill:(id)sender{
[vc.view removeFromSuperview];
[vc release];
}
答案 0 :(得分:3)
当您快速按下按钮时,至少在单击按钮的情况下,它会尝试release
视图但是多次按下按钮(假设只按一次按钮时代码有效)。 EXC_BAD_ACCESS代码表示您正在尝试访问已释放的某个内存位置。
防止这种情况的最佳方法是使用[NSButton setEnabled:(BOOL)enabled]
方法。按下创建按钮时,启用终止按钮并禁用创建按钮。按下kill按钮时,禁用kill按钮并启用create按钮。这样可以防止意外的额外分配或释放。
此外,在您的create方法中,您应该删除retain
的分配行中的额外vc
。 alloc
自动增加保留计数(为1),并且额外保留将其提升到2.按照它的方式,当按下kill按钮时,对象被释放一次,但保留计数是仍然1,造成内存泄漏。
答案 1 :(得分:0)
似乎vc
是iVar,因此您不应在release
方法中发送kill:
。所以只需删除代码行:
[vc release];
并将其添加到您的dealloc
方法。
注意,最好为create:
if (vc == nil)
vc = [[[VC alloc] initWithNibName:@"VC" bundle:[NSBundle mainBundle]] retain];
[_VW addSubview:vc.view];
否则,当您的vc
不为零时,它将导致内存泄漏。