【问题标题】:change view error更改视图错误
【发布时间】:2011-05-22 17:45:08
【问题描述】:

嗨 当我从一种视图切换到另一种视图时,我会这样做:

-(void)goInGame {

InGameViewController = [[InGameView alloc] initWithNibName:@"InGameView" bundle:nil];
[self presentModalViewController:self.InGameViewController animated:NO];
[InGameViewController release];

}

但是这种方式InGameViewController的retain count是“0”,但是InGameView的retain count是“-1”,有时会崩溃

错误: 将应用程序终止为两个未捕获的异常'NSInternalInconsistencyException',原因:'无法加载捆绑包NIB:'NSBundle <.... app>(已加载)'名称为'InGameView''

我哪里错了?

谢谢!

【问题讨论】:

  • NIB 文件似乎有问题。你检查过吗? InGameViewControllerretain-ed 属性吗?
  • 不要调用 retainCount。没用。
  • 你有没有想过这个问题?

标签: objective-c xcode uiviewcontroller


【解决方案1】:

我不明白你为什么要明确释放你的控制器。尝试删除[InGameViewController release]; 行,看看是否能解决您的问题。

如需了解更多信息,请查看 Apple 的 Memory Management Rules 以及 Memory Management Programming Guide 中的 Behind the Scenes: Retain Counts,其中指出

如果对象的保留计数减少 为 0,它被释放(见 “释放对象”)。

此外,

重要提示:通常应该有 没有理由明确询问对象 它的保留计数是多少(参见 保留计数)。结果往往 误导,因为您可能不知道 框架对象保留了什么 您感兴趣的对象。 在调试内存管理问题时, 你应该只关心 确保您的代码符合 所有权规则。

您的应用程序崩溃,因为它试图访问您的视图控制器,该控制器已被释放。

【讨论】:

  • 删除该行 inGameView(不是 GameViewController)的保留计数始终为 -1
  • @Vins 只是出于好奇,为什么要将 InGameView 的初始化实例分配给 InGameViewController?他们是同一个班级吗?
  • 它是同一个类,是我知道的从一个切换到另一个 uiviewcontroller 的唯一方法。你认为我错了吗?
  • @Vins 我在您的代码中没有看到任何名为 inGameView 的变量。另一方面,InGameView 是一个类的名称。
  • 正如克里斯所说,你的内存管理是错误的;你不应该发布InGameController(应该是inGameController,顺便说一句)。未加载 hte NIB 似乎可能无关。你的应用中有InGameView 类吗?是的——克里斯说的。我敢打赌你重命名了一个实例变量并且没有修复NIB文件中的连接。
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2013-01-24
  • 2012-06-16
相关资源
最近更新 更多