swift使用protocol的时候出现循环引用

Swift,iOS,Protocol

Posted by Karim on December 7, 2017

在给Alamofire用protocol封装一层业务的时候,定义了以下的协议和方法

protocol BaseRequest {
}
extension FIDRequest {
    func complete(_ completionHandler: @escaping ((DataResponse<Any>) -> ())) {
        let url = baseURL()+requestURI()
            Alamofire.request(url, method: method(), parameters: parameters(), encoding: encoding(), headers: headers()).responseJSON(completionHandler: completionHandler)
    }
}

protocol Request {

}

extension Request {
    func request() -> WBBaseRequest {
            complete {  (response)  in
//这里还有段代码造成循环引用
            }
       }
}

这时候问题就来了,正常情况下,应该使用[weak self]就可以解决了,但是在使用protocol的时候,是无法使用[weak self]的,然后就会有以下的报错 'weak' may only be applied to class and class-bound protocol types, not 'Self'

    func request() -> WBBaseRequest {
            complete {  (response) [weak self]  in //这个地方会报错 'weak' may only be applied to class and class-bound protocol types, not 'Self'
//这里还有段代码造成循环引用
            }
       }

直接解决这个问题的方式是,将 BaseRequest声明为只有类才可以使用

protocol BaseRequest : class {
}

然后就可以愉快的使用[weak self]

总结: weak只能用在类或者类的协议中,如果在协议扩展中使用了类而造成了循环引用,协议就需要指定必须是class才可以使用,structenum是不会造成循环引用的 参考链接: Why can the keyword “weak” only be applied to class and class-bound protocol types How can I make a weak protocol reference in ‘pure’ Swift (w/o @objc)


请保持转载后文章内容的完整,以及文章出处。本人保留所有版权相关权利。

分享到: