アプリがバックグラウンドに移行すると、View Controller クラスの割り当てが解除されます。ARCを使用しています。
アプリがアクティブになり、メソッドを実行するときに通知をサブスクライブする UIViewController があります。ただし、アプリがバックグラウンドで約 30 秒経過してから再開すると、アプリは「割り当て解除されたインスタンスにメッセージが送信されました」というメッセージでクラッシュします。
Zombie オブジェクトを有効にすると、View Controller 自体が Zombie であることがわかります。
ありがとうございました!
View Controller のインスタンス化 (AppDelegate 内):
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *myViewController = [storyBoard instantiateViewControllerWithIdentifier:@"MyViewController"];
AppDelegate のフォアグラウンド通知:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationForegrounded object:self];
}
ビュー コントローラーのフォアグラウンド通知:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeForeground) name:kNotificationForegrounded object:nil];
}
AppDelegate で強い参照を作成しようとしましたが、View Controller の割り当てが解除されます。
@property (strong, nonatomic) MyViewController *myViewController;
View Controllerを配列に追加して、AppDelegaeの配列への強い参照を試みましたが、それでも同じ結果が得られます:
@property (strong, nonatomic) NSMutableArray *viewControllers;
//...
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *myViewController = [storyBoard instantiateViewControllerWithIdentifier:@"MyViewController"];
self.viewControllers = [[NSMutableArray alloc] init];
[self.viewControllers addObject:myViewController];