将对象分配给可选委托会导致EXC_BAD_ACCESS

时间:2017-10-25 09:27:51

标签: ios swift delegates optional

我将一个对象分配给SKProductRequest.delegate,并出现运行时错误: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的情况下中断,则会再次发生错误。

任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

SKProductsRequest代表将不会保留您的ProductsRequestDelegate,因此您必须自行保留request.start()。这就是为什么如果你在sendProdRequest()添加一个断点,你仍然可以看到正在设置委托,但是当方法ProductsRequestDelegate完成时,没有任何东西保留在var productRequestDelegate上,它就会得到解除分配。

尝试将sendProdRequest()添加到定义了let request = SKProductsRequest(productIdentifiers: ProductType.all) productRequestDelegate = ProductsRequestDelegate(completion) request.delegate = productRequestDelegate request.start() 的对象,然后执行:

.human {
    background-color: white;
}

.human__arm {
    background-color: white;
}