ios - 如何防止 swift3 封闭件泄漏

标签 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)
    }}}

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

I also have a global instance in my app delegate like this

let app = UIApplication.shared.delegate as! 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)" }
        })
    }
}

在 FriendsVC 类中,此方法会产生泄漏。我怎样才能删除它? 我应该使用[unowned self]还是weak? [unowned self] 或弱可能会在保留周期的某些特殊情况下造成崩溃。 请建议我,如何解决它。

最佳答案

您需要在将使用 self 的闭包中使用 weak 修饰符

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

        if error == nil{

            // Do something with list

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

关于ios - 如何防止 swift3 封闭件泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270037/

相关文章:

iOS :[NSURLProtocol propertyForKey:inRequest:] return nil

ios - 如何从 NSDictionary (iOS) 中的键/值对中提取值

swift - “弱”可能只适用于类和类绑定(bind)协议(protocol)类型,而不是 'ContentView' 我缺少什么?

ios - 从 appdelegate 获取当前可见的 modalViewController

ios - 如何在 iOS7 的 UIPopoverController 中更改导航栏背景/颜色?

xcode - 有什么办法可以在 Swift 3 中进行真正的条件编译吗?

swift - 我们可以在枚举上使用 `if` 或 `guard` 而不是 `switch` 来提取值吗?

ios - 以问题为中心的事件指标

JavaScript 闭包操作

swift - 这个闭包 ()->() 在 swift 中能做什么?