список захвата для функции в Swift - PullRequest
0 голосов
/ 08 октября 2018

Когда закрытие использования можно избежать сильный опорного цикла с помощи weak или unowned для захвата списка.

1006 * Я знаю, что эта функция также названо закрытие.Так что я полагаю, что функция также захватывает значения из контекста.

Как можно избежать строгого ссылочного цикла для функции?

Коды ниже

class Person {
    var name: String?

    func printInfo() {
        print(self.name ?? "nil")
    }

    deinit {
         print("\(self.name ?? "") is deinitialized.")
    }
}

var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo
p1 = nil

Не печатать ни одного сообщения

...
p1 = nil
printFunction = nil

print Person1 is deinitialized.

У кого-нибудь есть решение по этому делу?В закрытии случае у нас есть weak, unowned список захвата.

1 Ответ

0 голосов
/ 09 октября 2018

Вы можете заменить метод на закрытие.

class Person {
    var name: String?

    lazy var printInfo = { [unowned self] in
        print(self.name ?? "nil")
    }

    deinit {
        print("\(self.name ?? "") is deinitialized.")
    }
}


var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo

p1 = nil

Этот код печати - Person1 is deinitialized.

Ленивый гарантирует, что доступ к свойству будет происходить именно после инициализацииНапример, self определенно будет существовать, и мы можем использовать self в теле замыкания.если вам нужна дополнительная информация, прочитайте о ARC - https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

...