Sobes.tech
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.