插入子视图时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];
}

查看此处的视图属性

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

它准确地陈述了我在评论中所说的内容:

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

直接来自苹果!

-(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];
}

修改到此代码

这是一个问题:

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

如果您不使用 ARC,则存在内存泄漏,因为一旦包含该行的方法结束,您将无法释放对象。

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

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

最新更新