Sobes.tech
Junior

Фарқи байни пайвандҳои заъиф ва қавӣ чист?

sobes.tech AI

Ҷавоб аз AI

Мәгариф идарәсе механизміндегі (ARC - Автоматикә Референцлар Санагы) аерма.

  • Көчле референция (Strong reference): Объектның референцлар санын 1гә арттыра. Объект, аңа кимендә бер көчле референция булганда гына, хәтердән чыгарыла алмый. Бу тәртип Swift-та үзлекләр һәм үзгәрүчәннәр өчен стандарт.

  • Зәгыйфь референция (Weak reference): Объектның референцлар санын арттырмый. Цикллы референцияләрне булдырмау өчен кулланыла, ике яки күбрәк объект бер-берсенә көчле референцияләр белән бәйләнгәндә, хәтер агып китүенә китерә. Зәгыйфь референцияләр һәрвакыт опциональ (Optional) була, чөнки аларга сылтамалы объект һәрвакыт бетерелә ала. Объект бетерелгәндә, зәгыйфь референция автоматик рәвештә nil була.

Цикллы референциянең мисалы һәм аның зәгыйфь референция белән кисәтүе:

class Person {
    let name: String
    var apartment: Apartment? // Башлангычта көчле референция
    init(name: String) { self.name = name }
    deinit { print("\(name) бетерелә") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Зәгыйфь референция
    init(unit: String) { self.unit = unit }
    deinit { print("Квартира \(unit) бетерелә") }
}

var john: Person? // Person объекты
var unit4A: Apartment? // Apartment объекты

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Цикллы көчле референция ясау:
// john, квартирага көчле референция тота
// квартира, кеше белән көчле референция тота
john!.apartment = unit4A
unit4A!.tenant = john // Бу зәгыйфь булырга тиеш, циклны өзү өчен

john = nil // Nil-га куелу, әгәр цикл бар икән, бетермәс
unit4A = nil // Nil-га куелу, әгәр цикл бар икән, бетермәс

// Зәгыйфь референция белән көтү:
// John Appleseed бетерелә
// Квартира 4A бетерелә

weak булмаса, tenant өчен, деструкторлар чакырылмас иде, бу хәтер агып китүен күрсәтә.