Sobes.tech
Junior — Middle

რის დროს უკეთესია unowned-ის გამოყენება weak-ის ნაცვლად მეხსიერების მართვაში?

sobes.tech AI

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

Swift-ში weak და unowned გამოიყენება ძლიერი მითითებების ციკლების თავიდან ასაცილებლად, მაგრამ ისინი სხვადასხვა სიტუაციებში გამოიყენება:

  • weak არის ვარიანტული მითითება, რომელიც ავტომატურად ხდება nil, როდესაც მითითებული ობიექტი გათავისუფლდება. გამოიყენება, როდესაც მითითება შეიძლება გახდეს nil ობიექტის სიცოცხლის განმავლობაში.

  • unowned არის არასარჩევი მითითება, რომელიც ვარაუდობს, რომ მითითებული ობიექტი ყოველთვის იქნება არსებულ დროს ამ მითითების გამოყენებისას. თუ ობიექტი გათავისუფლდა, unowned-ზე წვდომა გამოიწვევს შესრულების დროს შეცდომას.

სწორი გამოყენების შემთხვევებია, როდესაც:

  • მითითება ყოველთვის უნდა მიუთითებდეს არსებულ ობიექტზე (მაგალითად, მშობელი ობიექტი, რომელიც უფრო ხანგრძლივია, ვიდრე შვილი).
  • დარწმუნებული ხართ, რომ მითითებული ობიექტის სიცოცხლის ხანგრძლივობა არ იქნება მოკლე, ვიდრე მითითების ხანგრძლივობა.

მაგალითი:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)

აქ, CreditCard აქვს unowned მითითება Customer-ზე, რადგან ბარათი ვერ იარსებებს მომხმარებლის გარეშე, და მომხმარებელი უფრო ხანგრძლივია, ვიდრე ბარათი.