[iOS][課金]エラー「SKPaymentQueue message sent to deallocated instance」
* -[InAppPurchaseManager respondsToSelector:]: message sent to deallocated instance 0x1c7ad0
0
iQi - 面白いアプリを開発中
下記、一時関数内ではなく、viewDidLoadに追加スル必要あります。
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
0
iQi - 面白いアプリを開発中
追記です。
こんなコードを書いていたんですよ。どこかで見たコードのコピペですけど。
これだと、サーバからのレスポンスを受け取った時に、selfがdeallocateされてしまった後だと、まずいことになるんですよね。productRequestの後始末が考慮されていない。
というわけで、僕が採った解決法はこれ。
まず、ヘッダファイルでこんな宣言。
そして、本体コードでは、
これに加えて、viewWillDisappearで、delegateを無効化してやる処理を加えました。
そしたら、解決となります。
こんなコードを書いていたんですよ。どこかで見たコードのコピペですけど。
- (void)startRequest
{
SKProductsRequest* productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
productRequest.delegate = self;
[productRequest start];
}
これだと、サーバからのレスポンスを受け取った時に、selfがdeallocateされてしまった後だと、まずいことになるんですよね。productRequestの後始末が考慮されていない。
というわけで、僕が採った解決法はこれ。
まず、ヘッダファイルでこんな宣言。
@property (nonatomic, strong) SKProductsRequest *productRequest;
そして、本体コードでは、
- (void)startRequest
{
_productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
_productRequest.delegate = self;
[_productRequest start];
}
これに加えて、viewWillDisappearで、delegateを無効化してやる処理を加えました。
- (void)viewWillDisappear:(BOOL)animated {
_productRequest.delegate = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
そしたら、解決となります。