Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone uinavigationcontroller问题_Iphone_Objective C_Ios_Uinavigationcontroller - Fatal编程技术网

iPhone uinavigationcontroller问题

iPhone uinavigationcontroller问题,iphone,objective-c,ios,uinavigationcontroller,Iphone,Objective C,Ios,Uinavigationcontroller,我有两种观点; 视图A-显示表格列表-行A、行b、行c…(实际由ext API请求填写) 视图B-显示所选行的详细信息 现在让我们假设,当我第一次单击视图a上的a行时,它会将我带到a的详细视图(即e视图B)。之后,我返回视图A。现在,当我单击任一行A/b时,它会给我一个错误; 程序接收信号:“EXC\u坏访问” 这个问题并非每次都会发生。在某些情况下,我可以来回导航多次 我的代码是: bookdetailViewController = [[BookDetailViewController al

我有两种观点; 视图A-显示表格列表-行A、行b、行c…(实际由ext API请求填写) 视图B-显示所选行的详细信息

现在让我们假设,当我第一次单击视图a上的a行时,它会将我带到a的详细视图(即e视图B)。之后,我返回视图A。现在,当我单击任一行A/b时,它会给我一个错误; 程序接收信号:
“EXC\u坏访问”

这个问题并非每次都会发生。在某些情况下,我可以来回导航多次

我的代码是:

bookdetailViewController = [[BookDetailViewController alloc] initWithNibName:@"BookDetailView" bundle:[NSBundle mainBundle]];

请帮帮我。

我过去也遇到过类似的问题,结果通常是我释放了一个对象而没有保留它。具体来说,您可能需要检查视图和单元格中是否存在此问题。

为了给您提供最佳答案,需要查看
视图中的内容。加载:
视图将显示:
,可能还有
表视图:didSelectRowAtIndexPath:
方法

这一行:

bookdetailViewController = [[BookDetailViewController alloc] initWithNibName:@"BookDetailView" bundle:[NSBundle mainBundle]];

您正在初始化(并因此保留)BookDetailViewController的实例。当您返回查看A(我假设是BookListViewController或BookViewController)时,谁在处理该版本的发布。如果没有人负责释放它,那就是泄漏,它可能不会导致EXC_坏访问,但不好。

由于时间原因,很有可能您不能总是重复它。您说过屏幕由外部API请求填充。是否将详细视图设置为API请求的委托,以便在API请求完成且数据准备就绪时通知它

我建议您可以通过非常快速地从列表视图转到详细信息视图来重现错误,但是在详细信息视图可以加载其数据之前,请返回列表视图。如果详细信息视图是API请求的委托,则应用程序将崩溃,因为API请求的委托在能够调用您指定的任何委托消息之前已被解除分配。如果您给详细信息视图加载数据的时间,您将不会遇到此崩溃

我正在开发的一个应用程序中有一个类似的bug,目前正在通过一些黑客手段来避免它-在详细信息视图中:

-(void)dealloc
{
  [super dealloc];
  self = nil;
}

如果有人有更聪明的方法来确保解除分配视图设置为
nil
,我欢迎他们的建议。

我确实检查过了。我不会释放任何正在使用的obj。e、 g.视图/单元格事实上,我在大多数事情上都没有使用retain/release。调试程序接收到的信号“EXC\U BAD\U ACCESS”非常困难。由于它不提供任何特定的信息来添加,因此我还将一些信息从视图A传递到视图B aBook=[appDelegate.books objectAtIndex:indexPath.row];bookdetailViewController.aBook=aBook;[self.navigationController pushViewController:bookdetailViewController动画:是];我注意到的另一件重要的事情是,在显示细节视图时有时会出现不一致:例如,在第二次时,如果我单击b行,它会显示c的细节……这通常只发生在您尝试访问已释放内存的第二次(即前后)时。调试器是否提供了任何线索?寻找一个带有黑色字母的方法,这通常是你的方法,也是你的应用程序崩溃的地方。如果您试图在不存在对象的索引处访问对象,听起来可能是
[appDelegate.books objectAtIndex:indexath.row]
导致了您的问题。还有一个小提示:在应用程序委托中保留对象模型不是一个很好的选择。请看一些MVC文档(或者WWDC视频,如果您有付费开发人员帐户),我是否应该在BookListViewController中发布BookDetailViewController?通常是的。通常,如果您将其推送到navigationcontroller堆栈上,您将推送到detailviewcontroller上,然后调用release。这本质上意味着您放弃了对bookdetailviewcontroller的责任,让navigationcontroller决定何时发布它。另一个想法:我没有看到您实际声明bookdetailviewcontroller,我看到您为它设置了一个值。你在哪里申报的?是ivar吗?它是否仅在
didSelectRow:
方法的范围内?它真的不应该是ivar(接收器释放);接收器=零;对于ivars receiver.property=nil;对于所有时间内的属性