ビューコントローラに、アプリ内購入ストアを表示するボタンがあります。
storeSinglePlayer *ssp = [[storeSinglePlayer alloc] initWithNibName:@"storeSinglePlayer" bundle:nil];
//Animation Code
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:ssp animated:NO];
ナビゲーションコントローラーは、このストアを画面に正常にプッシュします。ストアには、次のコードを実行する戻るボタンがあります。
[self.request cancel];
self.request.delegate = nil;
self.request = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController popViewControllerAnimated:NO];
これも正常に実行されます。しかし、ボタンをクリックしてストアビューコントローラーを再度表示すると、次のメッセージが表示されます。
-[storeSinglePlayer respondsToSelector:]: message sent to deallocated instance 0xd642df0
これは確かに非常に有名な問題です。上記のコードでわかるように、stackoverflowに関するさまざまな投稿に出くわした提案を取り入れました。次のコードが実装されています。
[self.request cancel];
self.request.delegate = nil;
self.request = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
また、私は自分のプロパティと対応する合成を次のように設定しています。
@property (nonatomic, strong) SKProductsRequest *request;
@synthesize request = _request;
手がかりがない、なぜクラッシュするのか!
PS:プロジェクトはARC対応です。