应用程序来自后台“消息发送到解除分配的实例”

时间:2012-07-04 15:32:36

标签: objective-c ios ios5

我收到一个奇怪的错误。我们正在使用带有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?

在app委托中,我声明如下:

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

1 个答案:

答案 0 :(得分:1)

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

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

假设nib名称是“vcDashboard”(似乎就是这种情况)并且nib中的类也是“vcDashboard”。
(顺便说一句,惯例是大写类名。)

此外,在应用程序进入后台后,可能会取消分配vcDashboard。在任何情况下,当应用程序从后台返回时,无法保证它仍然存在。你有没有考虑懒惰的实例化?

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

   vcDasboard vc = [[vcDashboard alloc] init];
   // more initialization code
   _vcDashboard = vc;
   return vc;
}