Sobes.tech
Middle

როგორ შეიძლება თავიდან აიცილოთ iOS-ში შენახვის ციკლი (retain cycle)?

sobes.tech AI

პასუხი AI-სგან

Туура колдонуу менен алсыз (weak) же шартысыз (unowned) шилтемелер аркылуу кармоо циклдери алдын алынышы мүмкүн.

Алсыз шилтемелер (weak):

  • Объекттин шилтемелер санын көбөйтпөйт.
  • Нөлгө айлануусу мүмкүн (nil).
  • Бир объект башка объекттен көз каранды болбосо, колдонулат (мисалы, делегат).
class DelegateExample {
    weak var delegate: SomeDelegateType? // Делегатка алсыз шилтеме
}

Шартсыз (unowned) шилтемелер:

  • Объекттин шилтемелер санын көбөйтпөйт.
  • Гаранттуу nil эмес.
  • Бир объект башка объектти ачык эле ээ болсо, бирок көз каранды объект гана ээси менен бирге болушу мүмкүн (мисалы, жабуулар, self-ди камтыган class ичинде, анда жабуу ачык эле класс экземплярга тиешелүү). unowned шилтемеге кирүүдө, эгер объект алгачкы бошотулуп калса, иштөө учурунда ката болот.
class Owner {
    var closure: (() -> Void)?

    func setupClosure() {
        closure = { [unowned self] in // Шартсыз алсыз шилтеме self-ге
            // self колдонуу
            print("Using unowned self")
        }
    }
}

Жабууларда колдонуу: Жабуулар класстардын экземплярларын күчтүү шилтемеде кармап калса, кармоо циклдерин түзүшү мүмкүн, жана бул класс экземпляры жабууга дагы күчтүү шилтемени камтыйт. Бул алдын алуу үчүн, жабууларда capture list колдонулат:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = { [weak self] in // Алсыз шилтеме self-ге
        guard let strongSelf = self else {
            return "" // self алгачкы `nil` болсо
        }
        if let text = strongSelf.text {
            return "<\(strongSelf.name)>\(text)</\(strongSelf.name)>"
        } else {
            return "<\(strongSelf.name)/>"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) жоюлду")
    }
}

Интихоб между weak и unowned зависит от семантики отношений между объектами:

  • weak: когда ссылка может стать nil в течение жизненного цикла объекта, на который ссылаются.
  • unowned: когда объект, на который ссылаются, гарантированно существует дольше или столько же, сколько объект, который на него ссылается, и ссылка никогда не станет nil.