Sobes.tech
Junior — Middle

Оё мумкин аст мушкилот ё бехабарии ногаҳонӣ рух диҳад, агар яке аз пӯшидаҳои дохилии синф ба усулҳо ё хосиятҳои он муроҷиат кунад?

sobes.tech AI

Ҷавоб аз AI

Оё, дар истифодаи пӯшидаҳо (closures) дар дохили синф дар Swift, мушкилот бо эҳтимолияти нигоҳ доштани self ва циклҳои нигоҳдорӣ (retain cycles) пайдо мешаванд.

Агар пӯшида self-ро бе истифодаи истиноди заиф ([weak self]) ё номаълум ([unowned self]) захира кунад, ин метавонад ба он оварда расонад, ки намунаи синф аз ёдраскунӣ озод нашавад, зеро пӯшида як истиноди қавӣ ба self нигоҳ медорад, ва self метавонад пӯшида-ро нигоҳ дорад.

Маслиҳати масъала:

class MyClass {
    var closure: (() -> Void)?
    var value = 10

    func setupClosure() {
        closure = {
            print(self.value) // захира кардани self
        }
    }

    deinit {
        print("MyClass аз ёд рафт")
    }
}

var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass аз сабаби цикл нигоҳдорӣ озод намешавад

Барои пешгирӣ аз ин, истифодаи истиноди заифро истифода баред:

closure = { [weak self] in
    guard let self = self else { return }
    print(self.value)
}

Инчунин, муҳим аст, ки эҳтиёткорона нигоҳ доштани захира кардани self дар пӯшидаҳо дар дохили синфҳо, барои пешгирӣ кардани сӯхтани ёдраскунӣ ва рафторҳои номувофиқ.