插入子视图时EXC_BAD_ACCESS? (苹果手机)

时间:2012-06-22 12:49:39

标签: iphone ios xcode exc-bad-access

当我在iPhone上使用方法insertSubview:atIndex:时,程序无法运行,并且main.m文件中有EXC_BAD_ACCESS。但是,当我使用presentModalViewController时,程序运行完美。

此外,方法switchToView在第一次使用时工作,具有不同的to和from,但第二次没有。

出了什么问题?

这是我的代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{    
  ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];
  [self switchToView:sbd from:self];
}

我的方法如下:

-(void)switchToView:(UIViewController*)nextView from:(UIViewController*)currentView
{
  [currentView.view insertSubview:nextView.view atIndex:1];
}

3 个答案:

答案 0 :(得分:5)

在这里查看视图属性

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

严格说明我在评论中所说的内容:

“每个视图控制器对象是其视图的唯一所有者。您不能将同一视图对象与多个视图控制器对象关联。此规则的唯一例外是容器视图控制器实现可以将此视图添加为子视图在自己的视图层次结构中。在添加子视图之前,容器必须首先调用其addChildViewController:方法,以在两个视图控制器对象之间创建父子关系。“

直接来自Apple!

答案 1 :(得分:0)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

[self switchToView:sbd from:self.view];
}

-(void)switchToView:(UIViewController*)nextView from:(UIView*)currentView{
[currentView insertSubview:nextView.view atIndex:1];
}

修改为此代码

答案 2 :(得分:0)

这是一个问题:

ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

如果你没有使用ARC,那就是内存泄漏,因为一旦包含该行的方法结束,你就无法释放对象。

如果 使用ARC,它将自动释放sbd,其视图中引用控制器的任何内容都将尝试使用dealloc'd对象。

您应该在此类中使ShowBookDetails *sbd成为强(或保留)属性,而不是局部变量。