Junior — Middle
რა განსხვავებაა Weak და Unowned ტიპის მითითებებს მეხსიერების მართვაში?
sobes.tech AI
პასუხი AI-სგან
Swift-ში weak და unowned ტიპის მითითებები გამოიყენება მეხსიერების მართვაში ძლიერი მითითებების ციკლების (retain cycles) თავიდან ასაცილებლად, მაგრამ განსხვავდებიან მათი ქცევით და გამოყენებით.
-
Weak (სუსტი მითითება):
- შეიძლება იყოს
nil. - გამოაცხადება როგორც ოპციონალური ტიპი (
var delegate: SomeDelegate? weak). - გამოიყენება, როდესაც მითითება შეიძლება გახდეს
nilობიექტის სიცოცხლის განმავლობაში, მაგალითად, დელეგატები. - სისტემა ავტომატურად აყენებს
weakმითითებასnil-ზე, როდესაც მითითებული ობიექტი გათავისუფლდება.
- შეიძლება იყოს
-
Unowned (მფლობელის გარეშე):
- არ შეიძლება იყოს
nil(არ არის ოპციონალური ტიპი). - გამოიყენება, როდესაც მითითება გარანტირებულად არსებობს ობიექტის სიცოცხლის განმავლობაში, მაგალითად, მშობელი და ბავშვი.
- თუ მითითებული ობიექტი უკვე გათავისუფლებულია, წვდომის მცდელობა გამოიწვევს შეცდომას შესრულების დროს (crash).
- არ შეიძლება იყოს
მაგალითი:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// აქ, tenant არის unowned, რადგან ბინა ვერ არსებობს ბინის მფლობელის გარეშე.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// დელეგატი არის weak, რადგან შეიძლება ადრე გათავისუფლდეს.
ამიტომ, weak შესაფერისია მითითებებისთვის, რომლებიც შეიძლება გახდნენ nil, ხოლო unowned — მითითებებისთვის, რომლებიც ყოველთვის უნდა იყოს ვალიდური ობიექტის სიცოცხლის განმავლობაში.