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 მითითება.