Как предотвратить утечку в закрытии swift3 - PullRequest
0 голосов
/ 10 мая 2018

Я успешно реализовал замыкание в классе, чтобы получить отфильтрованные контакты из моей телефонной книги, но когда я вызываю это замыкание, оно создает утечку, я протестировал его в инструментальном инструменте 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)
    }}}

Я использую этот метод в другом классе, см. Мою реализацию.

У меня также есть глобальный экземпляр в моем делегате приложения, подобный этому

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 этот метод вызывает утечку. Как я могу удалить это? Должен ли я использовать [не владеющий собой] или слабый? [Неизвестный Я] или слабый может вызвать сбой в некоторых особых случаях цикла сохранения. Подскажите пожалуйста, как это исправить.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

@ Harendra

Как указано @Reinier, используйте приведенный ниже код, как показано ниже.

self.app.cri? .AllSBFriends (обработчик: {[слабый self] (SBfriendsUIDs, ошибка) в

    if error == nil{

        // Do something with list

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

IMP : - Также реализация внутри CRBlock func должна быть внутри @autoreleasepool { // Реализация функции CRBlock }

0 голосов
/ 10 мая 2018

Вам нужно использовать модификатор 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)" }
    })
...