[iOS][課金]エラー「SKPaymentQueue message sent to deallocated instance」

* -[InAppPurchaseManager respondsToSelector:]: message sent to deallocated instance 0x1c7ad0
2015-07-14 17:15 コメント
已邀请:
0

iQi - 面白いアプリを開発中

{ 賛成 }:

下記、一時関数内ではなく、viewDidLoadに追加スル必要あります。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2015-07-14 17:17 コメント
0

iQi - 面白いアプリを開発中

{ 賛成 }:

追記です。

こんなコードを書いていたんですよ。どこかで見たコードのコピペですけど。

- (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]; 
}


そしたら、解決となります。
2015-07-15 11:26 コメント

ログインまたは登録してから回答してください

lujian
lujian

Javaが得意です。

@ステータス

  • 更新: 2015-07-15 11:26
  • 閲覧: 1360
  • フォロー: 2
EXIT フルスクリーンモード 回答