Sobes.tech
Middle

Unowned ტიპის მითითებები რა მიზნით გამოიყენება?

sobes.tech AI

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

unowned მიმთითლებლები აუცილებელია ციკლური მითითებების (retain cycles) გადაჭრისთვის ობიექტებს შორის, როდესაც ორივე ობიექტს აქვს ძლიერი მითითება ერთმანეთზე, მაგრამ ერთის სიცოცხლის ციკლი მოკლეა ან თანაბარია მეორისთან.

unowned გამოიყენება, როდესაც ცნობილია, რომ მითითებული ობიექტი არ იქნება nil მთელი მისი სიცოცხლის განმავლობაში, ხოლო ობიექტი, რომელიც შეიცავს მითითებას. განსხვავებით weak-ისგან, unowned-ში მიუთითებელი არ არის Optional. თუ ობიექტი, რომელსაც unowned მითითება აქვს, დეალოკატირდება ადრე, ვიდრე ობიექტი, რომელსაც აქვს unowned მითითება, მოხდება crash.

მაგალითი გამოყენებაში დახურულ კოდში:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) ინიცირებულია")
    }

    deinit {
        print("\(name) დეინიცირებულია")
    }
}

class Apartment {
    let unit: String
    // ვიყენებთ `unowned`, რადგან ცნობილია, რომ
    // Apartment ვერ იარსებებს გარეშე Person-ის
    // (ამ კონტექსტში). Person შეიძლება იყოს nil,
    // მაგრამ თუ Apartment არსებობს, მაშინაც არსებობს Person.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Apartment \(unit) ინიცირებულია")
    }

    deinit {
        print("Apartment \(unit) დეინიცირებულია")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// ამ მაგალითში, tenant შეიძლება იყოს nil, ამიტომ `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// ძლიერი მითითებების გაწყვეტა, რათა დავადასტუროთ დეალოკაცია
john = nil
unit4A = nil

ამ მაგალითში, Person აქვს ძლიერი მითითება Apartment-ზე (var apartment: Apartment?). Apartment-ს შეუძლია ჰქონდეს ძლიერი მითითება Person-ზე, რაც გამოიწვევს ციკლს. თუმცა, რადგან ამ კონტექსტში, Apartment ლოგიკურად არ შეიძლება არსებობდეს Person-ის გარეშე (რომელიც იჯარით აძლევს), მითითება Apartment-დან Person-ზე კეთდება unowned-ით. ასე, როდესაც ვაყენებთ john = nil, Person დეალოკატირდება, და შემდეგ (რადგან ძლიერი მითითებები Apartment-ზე არ არის) ისიც დეალოკატირდება.

ძირითადი განსხვავებები weak-თან:

  • ცხოვრების ციკლი: unowned გამოიყენება, როდესაც მითითებული ობიექტის სიცოცხლის ციკლი იგივეა ან უფრო გრძელია. weak გამოიყენება, როდესაც ის შეიძლება ადრე დეალოკატირდეს.
  • Optional: unowned არ არის Optional (თუ არ არის გამოცხადებული unowned optional). weak ყოველთვის არის Optional.
  • უსაფრთხოება: წვდომა unowned მითითებაზე უკვე დეალოკატირებულ ობიექტზე გამოიწვევს crash-ს. წვდომა weak მითითებაზე დააბრუნებს nil-ს.

ასე რომ, unowned არის არასაკუთრობადი (non-owning) მითითება, რომელიც გამოიყენება, როდესაც გარანტირებულია, რომ მითითებული ობიექტი არსებობს მანამ, სანამ არსებობს unowned მითითება.