0

我遇到了一个奇怪的错误。我们正在使用带有 ARC 的 iOS 5。当 NSZombiesEnabled 设置为 true 并且应用程序插入调试器时,我们会收到此错误(它也正常发生,但不那么一致)

2012-07-04 11:25:17.161 Trivial[624:707] -[vcCurrentGames gamesLoaded:] [Line 284] Found 62 games that are my turn.
2012-07-04 11:25:17.162 Trivial[624:707] -[vcCurrentGames gamesLoaded:] [Line 285] Found 26 games that are their turn.
2012-07-04 11:25:17.169 Trivial[624:707] -[vcCurrentGames tableView:heightForHeaderInSection:] [Line 409] Height 1: 29
2012-07-04 11:25:17.171 Trivial[624:707] *** -[vcDashboard retain]: message sent to deallocated instance 0xf62c3c0

我们不会在任何地方保留仪表板(ARC 不允许保留)。这仅在应用程序从后台加载后才会发生。vcCurrentGames 实际上是仪表板上的一个 UITableView。这让我更加奇怪,因为如果仪表板被释放,那么为什么它会加载 UITableView?

我已经阅读了一些关于此的内容。仪表板在应用程序委托中定义为一个属性:

@property (nonatomic, strong) vcDashboard *vDashboard;

我试图让这个变弱,以便它会归零,但这也不起作用。有人可以告诉我为什么它被解除分配,或者为什么它在解除分配后试图保留 vcDashboard?

在应用程序委托中,我这样声明:

UIViewController *viewController = [[vcDashboard alloc] initWithNibName:@"vcDashboard" bundle:nil];
self.vDashboard = (vcDashboard *)viewController;
4

1 回答 1

1

初始化过程中可能出现问题。您将 分配vcDashboard给 aUIViewController然后将该控制器强制转换为适当的类。虽然理论上这应该没问题,但我以前从未见过这种模式。标准方法是:

self.vDashboard = (vcDashboard*) [[vcDashboard alloc] init];

假设笔尖名称是“vcDashboard”(似乎是这种情况)并且笔尖中的类也是“vcDashboard”。
(顺便说一句,约定是大写类名。)

此外,在应用程序进入后台后,vcDashboard 可能会被释放。在任何情况下,都不能保证当应用程序从后台返回时它仍然存在。你考虑过惰性实例化吗?

// in app delegate
-(vcDashboard*)vDashboard {
   if (_vcDashboard) {
     return _vcDashboard;
   }

   vcDasboard vc = [[vcDashboard alloc] init];
   // more initialization code
   _vcDashboard = vc;
   return vc;
}
于 2012-07-04T15:59:48.140 回答