如何防止关闭swift3泄漏

时间:2018-05-10 09:47:25

标签: ios swift3 closures

我已经在课堂上成功实现了一个闭包,以便从我的电话簿中获取过滤的联系人,但是当我调用此闭包时会产生泄漏,我在Xcode乐器工具中测试了它。

参见我的实施,

class CR: NSObject {

 func GetAllSBUser(handler:@escaping (Array<SBUserModel>?, Error?) -> ()) {
    CRBlock = handler

    if self.AllUSersModels.count>0 {
       self.CRBlock(self.AllUSersModels, nil)
    } else {
        self.CRBlock(nil, err)
    }}}

我在另一个类中使用此方法,请参阅我的实现。

  

我的app app delegate中也有一个全局实例,如此

     

让app = UIApplication.shared.delegate为!的AppDelegate

class friendsVC: UIViewController, UITextFieldDelegate {

override func viewDidLoad() {
        super.viewDidLoad()

        self.app.cri?.AllSBFriends(handler: { (SBfriendsUIDs, error) in

            if error == nil{

                // Do something with list

            } else{ self.friendsCountLbl.text = "Friends \(0)" }
        })
    }
}

在class friendsVC中,此方法会产生泄漏。我该如何删除它? 我应该使用[无主自我]还是弱者? [无主自我]或弱者可能会在某些保留周期的特殊情况下造成崩溃。 请建议我,如何解决它。

2 个答案:

答案 0 :(得分:2)

您需要将weak修饰符用于您将使用self

的闭包
self.app.cri?.AllSBFriends(handler: { [weak self] (SBfriendsUIDs, error) in

        if error == nil{

            // Do something with list

        } else{ self?.friendsCountLbl.text = "Friends \(0)" }
    })

答案 1 :(得分:0)

@Harendra,

正如@Reinier所传达的那样,使用下面的代码。

self.app.cri?.AllSBFriends(handler:{[weak self](SBfriendsUIDs,error)in

    if error == nil{

        // Do something with list

    } else{ self?.friendsCountLbl.text = "Friends \(0)" }
})

IMP : - CRBlock func中的实现也应该在@autoreleasepool {里面   // CRBlock函数的实现 }