(viewConroller.view removeFromSuperview)线程:1 EXC_BAD_ACCESS(代码= 1,地址= 0x6000000008)

时间:2012-04-14 02:07:35

标签: iphone objective-c ios ipad

(^。^)对不起,我的英语不好。

嗨我有下一个问题我创建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];
}

2 个答案:

答案 0 :(得分:3)

当您快速按下按钮时,至少在单击按钮的情况下,它会尝试release视图但是多次按下按钮(假设只按一次按钮时代码有效)。 EXC_BAD_ACCESS代码表示您正在尝试访问已释放的某个内存位置。

防止这种情况的最佳方法是使用[NSButton setEnabled:(BOOL)enabled]方法。按下创建按钮时,启用终止按钮并禁用创建按钮。按下kill按钮时,禁用kill按钮并启用create按钮。这样可以防止意外的额外分配或释放。

此外,在您的create方法中,您应该删除retain的分配行中的额外vcalloc自动增加保留计数(为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不为零时,它将导致内存泄漏。