2017-10-25 10 views
0

SKProductRequest.delegateにオブジェクトを割り当て、実行時エラーEXC_BAD_ACCESSが発生しました。オプションの代理人にオブジェクトを割り当てると、EXC_BAD_ACCESSが発生する

public class MyDelegate : NSObject, SKProductsRequestDelegate { 

    public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
     // ... 
    } 
} 

func sendProdRequest() { 
    let request = SKProductsRequest(productIdentifiers: ProductType.all) 
    request.delegate = ProductsRequestDelegate(completion) 
    request.start() 
} 

私はrequest.startにブレークポイントを設定した場合は()とコードがエラーなしで動作し、コンソールにrequest.delegateを印刷します。しかし、もし私がrequest.delegateを印刷せずに壊れば、エラーは再び発生します。

これはなぜ起こるのですか?

+0

はProductsRequestDelegate' 'についての詳細を表示します。 – Lumialxk

答えて

1

SKProductsRequest代理人はあなたのProductsRequestDelegateを保持しないので、自分で行う必要があります。そのため、request.start()にブレークポイントを追加すると、デリゲートが設定されているのを確認できますが、sendProdRequest()メソッドが終了しても、ProductsRequestDelegateは何も保持されず、割り当てが解除されます。

てみsendProdRequest()が定義されているオブジェクトにvar productRequestDelegateを追加し、実行します。

let request = SKProductsRequest(productIdentifiers: ProductType.all) 
productRequestDelegate = ProductsRequestDelegate(completion) 
request.delegate = productRequestDelegate 
request.start() 
+0

productRequestDelegateがfuncのローカル変数として機能しません。それはクラスvarとして動作します。 – jarly

+0

何とかそれを保持する方法があるだけで、 'ProductsRequestDelegate'オブジェクトがそれ自身を保持し、要求が完了すると解放することさえできます – Ladislav

関連する問題