Фарқи байни пайвандҳои заъиф ва қавӣ чист?
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 өчен, деструкторлар чакырылмас иде, бу хәтер агып китүен күрсәтә.