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を aに割り当ててから、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;
}
于 2012-07-04T15:59:48.140 に答える