ARC環境下でStoreKitを使う場合の注意


久しぶりのStoreKitネタです。といっても大した内容ではありませんが。

iOS 4系に対応しろというような話もめっきり聞かなくなり、仕事の現場でもオープンソースのライブラリでも、いよいよARCがメインの時代がやってきたなという感じがしています。当然ながらStoreKit含め、アップルの公式フレームワークはARC / 非ARCのどちらでも使用できるのですが、ドキュメントの更新が追いついていなかったりで稀に落とし穴があります。

StoreKitの組み込み手順を示す公式ドキュメント「In-App Purchase Programming Guide」にもそういった落とし穴が一つあります。

StoreKitを使ったアプリ内課金を実装する上では、PaymentQueueにオブザーバーを設定する必要があり、ドキュメント内には下記のような説明とサンプルコードが記載されています。

Register a transaction observer with the payment queue.
Your application should instantiate a transaction observer and add it as an observer of the payment queue.

MyStoreObserver *observer = [[MyStoreObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

素直にこのコードをこのまま組み込んで実行すると、一向に課金処理が進みません。

理由: オブザーバーがaddTransactionObserverではretainされないため、すぐに解放される

というわけで、少し面倒くさいですがオブザーバーのインスタンスはすぐに解放されないよう、アプリケーション側でstrongで保持しておく必要があります。

地味に非ARCコードをARCに変換した時の非同期処理等で陥りがちなパターンの一つなので注意しましょう。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です