0

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

嗨我有下一个问题我创建 2 个按钮第一个按钮创建一个视图控制器并将他的视图添加到其他视图控制器第二个按钮我释放创建的视图控制器并从父级删除视图。如果我更快地点击 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];
}
4

2 回答 2

3

当您快速按下按钮时,至少在终止按钮的情况下,release无论您按下按钮多少次,它都会尝试查看视图(假设您只按下一次按钮时代码有效)。EXC_BAD_ACCESS 代码意味着您正在尝试访问一些已被释放的内存位置。

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

retain此外,在您的 create 方法中,您应该在vc's allocation 行中删除该额外内容。alloc自动增加保留计数(到 1),并且额外的保留将其增加到 2。这样,当按下终止按钮时,对象被释放一次,但保留计数仍然是 1,创建一个内存泄漏。

于 2012-04-14T02:32:05.953 回答
0

这似乎vc是一个 iVar,所以你不应该发送方法releasekill:所以只需删除代码行:

[vc release];

并将其添加到您的dealloc方法中。


请注意,最好使用如下代码create:

if (vc == nil)
  vc = [[[VC alloc] initWithNibName:@"VC" bundle:[NSBundle mainBundle]] retain];
[_VW addSubview:vc.view];

否则,当你vc的不是 nil 时,它会导致内存泄漏。

于 2012-04-14T02:50:07.623 回答