Sobes.tech
Middle

რა არის unowned Swift-ის კონტექსტში?

sobes.tech AI

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

Unowned — бул Swiftтеги (ARC) автоматтык эс тутумду башкаруу менен байланыштуу. Unowned шилтемелер күчтүү шилтемелер циклин алдын алуу үчүн колдонулат, эгерде эки объект бири-биге күчтүү шилтеме жасаса. Unowned шилтеме объекттин шилтеме санын көбөйтпөйт. Weak шилтемеден айырмаланып, unowned шилтеме дайыма ишенимдүү түрдө көрсөтүп тургандай, ал бар экенине ишенет; эгер ал шилтеме көрсөтүп турган объект бошотулса, аракет кылуу катага алып келет. Бул байланыштуу объекттин жашоо цикли unowned шилтемесин камтыган объекттин жашоо циклинен кеминде же тең болушу керек деген шартта колдонулат.

Кыскача колдонуу мисалы:

class Department {
    var name: String
    var courses: [Course] = []

    init(name: String) {
        self.name = name
        print("\(name) бөлүмү ишке киргизилип жатат")
    }

    deinit {
        print("\(name) бөлүмү жоюлуп жатат")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned шилтеме

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) сабак ишке киргизилип жатат")
    }

    deinit {
        print("\(name) сабак жоюлуп жатат")
    }
}

var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Эми `Department` объекти бошотулушу мүмкүн
introToAccounting = nil // Эми `Course` объекти бошотулушу мүмкүн

Бул мисалда Course Departmentка unowned шилтемесин колдонуп турат. Эгерде Course Department жок болмогон болсо, анда логикалык жактан, ал Department менен байланыштуу жана Department courses массиви аркылуу анын жашоо циклін башкарат, ошондуктан unowned колдонуу туура. Бул accounting жана introToAccounting ортосунда күчтүү цикл түзүүнү алдын алат. Эгер accounting nil болсо, Department объекти бошотулушу мүмкүн, жана андан соң Course объекти да бошотулушу мүмкүн, анткени башка күчтүү шилтемелер калбайт.