Middle
Dəyər yığımda ola bilər və istinad yığımda? Fikrinizlə izah edin.
sobes.tech Süni İntellekt
AI-dan cavab
Bəli, bu standart davranışdır.
- Yığım (Stack): Yerli dəyişənləri və obyektlərə (referanslara) işarə edən göstəriciləri (göstəricilər) saxlayır. Yığımda verilənlərin ömrü funksiyanın və ya kod blokunun scope (sahə) ilə bağlıdır. Məlumatlara giriş sürətlidir.
- Heap (Yığım): Dinamik olaraq yaradılan obyektləri saxlayır. Heap-də verilənlərin ömrü scope ilə bağlı deyil və yaddaş idarəetmə mexanizmi (iOS-də ARC) tərəfindən idarə olunur. Məlumatlara giriş yığımda olduğundan daha yavaşdır.
Swift-də bir sinif obyektini yaratdıqda (məsələn), obyekt özü heap-də yerləşir. Bu obyekti saxlamaq üçün təyin etdiyimiz dəyişən, əsasən, heap-dəki verilərə işarə edən (göstərici) bir referansdır və yığımda saxlanılır.
Swift-də nümunə:
// MyObject, heap-də yaradılan bir sinif (referans tipi)
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func myFunction() {
// myObject - yığında saxlanan və heap-dəki MyObject nümunəsinə işarə edən referans
let myObject = MyObject(name: "Test")
// ... myObject-in istifadəsi ...
} // myObject (referans) funksiyadan çıxarkən yığından silinir
// MyObject nümunəsi heap-də ARC tərəfindən, artıq güclü referanslar olmadıqda yox edilir
Oxşar şəkildə Objective-C-də:
// MyObject, heap-də yaradılan bir sinif (referans tipi)
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name;
@end
@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
}
return self;
}
@end
void myFunction() {
// myObject - yığında saxlanan və heap-dəki MyObject nümunəsinə işarə edən referans
MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
// ... myObject-in istifadəsi ...
} // myObject (referans) funksiyadan çıxarkən yığından silinir
// MyObject nümunəsi heap-də ARC tərəfindən, artıq güclü referanslar olmadıqda yox edilir
Hər iki halda, myObject dəyişəni yığında yerləşir, və MyObject obyektinin özü heap-də yerləşir. myObject dəyişəni, heap-dəki obyektin yaddaş ünvanını saxlayır.