我已经在课堂上成功实现了一个闭包,以便从我的电话簿中获取过滤的联系人,但是当我调用此闭包时会产生泄漏,我在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中,此方法会产生泄漏。我该如何删除它? 我应该使用[无主自我]还是弱者? [无主自我]或弱者可能会在某些保留周期的特殊情况下造成崩溃。 请建议我,如何解决它。
答案 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函数的实现 }