Sobes.tech
Middle

Чӣ гуна метавон аз пайдоиши давраи нигоҳдорӣ (retain cycle) дар iOS пешгирӣ кард?

sobes.tech AI

Ҷавоб аз AI

Циклҳои нигоҳдорӣ бо истифодаи дуруст аз референсҳои заъф (weak) ё бе шарт (unowned) пешгирӣ мешаванд.

Референсҳои заъф (weak):

  • Ҳисобкунаки референсҳоро зиёд намекунанд.
  • Метавонанд nil шаванд.
  • Вале, вақте як объект метавонад мустақилона вуҷуд дошта бошад (масалан, делегат).
class DelegateExample {
    weak var delegate: SomeDelegateType? // Референси заъф ба делегат
}

Референсҳои бе шарт (unowned):

  • Ҳисобкунаки референсҳоро зиёд намекунанд.
  • Бе шарт ва кафолатнок нест, ки nil шавад.
  • Вале, вақте як объект равшан соҳиби дигар аст, аммо объекти вобаста метавонад танҳо бо соҳиби вуҷуд дошта бошад (масалан, бастаҳо, даргиронии self дар класс, ки баста равшан "медонад" ки ба экземпляри класс тааллуқ дорад). Агар ба референси unowned дастрасӣ шавад ва объект аллакай озод карда шуда бошад, хатогӣ ба амал меояд.
class Owner {
    var closure: (() -> Void)?

    func setupClosure() {
        closure = { [unowned self] in // Референси бе шарт ба self
            // Истифодаи self
            print("Истифодаи unowned self")
        }
    }
}

Истифода дар бастаҳо: Бастаҳо метавонанд циклҳои нигоҳдорӣ эҷод кунанд, агар онҳо намунаҳои классҳоро бо референси қавӣ дар бар гиранд, ва он намунаи класс низ дорои референси қавӣ ба баста мебошад. Барои пешгирӣ, истифода мешавад рӯйхати захираҳо (capture lists) дар оғози баста:

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 намешавад.