Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将对象分配给可选委托会导致EXC\u访问错误_Ios_Swift_Delegates_Optional - Fatal编程技术网

Ios 将对象分配给可选委托会导致EXC\u访问错误

Ios 将对象分配给可选委托会导致EXC\u访问错误,ios,swift,delegates,optional,Ios,Swift,Delegates,Optional,我为SKProductRequest.delegate分配了一个对象,并得到一个运行时错误:EXC\u BAD\u ACCESS public class MyDelegate : NSObject, SKProductsRequestDelegate { public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { // ...

我为SKProductRequest.delegate分配了一个对象,并得到一个运行时错误:EXC\u BAD\u 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,那么错误会再次发生


有人知道为什么会发生这种情况吗?

SKProductsRequest
s委托将不会保留您的
产品请求委托
,因此您必须自己保留。这就是为什么如果您在
request.start()
处添加断点,您仍然可以看到正在设置的委托,但是当方法
sendProdRequest()
完成时,
ProductsRequestDelegate
没有保留任何内容,它会被释放

尝试将
var productRequestDelegate
添加到定义了
sendProdRequest()
的对象中,然后执行以下操作:

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

显示有关
ProductsRequestDelegate
的更多详细信息。productRequestDelegate在func中不作为本地变量工作。它作为一个类变量工作。只要有办法以某种方式保留它,您甚至可以让
ProductsRequestDelegate
对象保留自己,并在请求完成后释放