Sobes.tech
Middle

Може ли вредност да буде у купи, а референца у стеку? Објасните своје мишљење.

sobes.tech АИ

Одговор од АИ

Da, ovo je standardno ponašanje.

  • Stek: Čuva lokalne promenljive i pokazivače (referencije) na objekte. Vreme trajanja podataka na steku je povezano sa scope-om (obimom) funkcije ili bloka koda. Pristup podacima je brz.
  • Heap (heap): Čuva objekte koji su dinamički kreirani. Vreme trajanja podataka na heap-u nije povezano sa scope-om i upravlja se mehanizmom upravljanja memorijom (ARC u iOS). Pristup podacima je sporiji nego na steku.

Kada kreiramo objekat klase u Swift-u (npr.), sam objekat se nalazi na heap-u. Promenljiva koju deklarisemo za čuvanje tog objekta je u suštini referenca (pokazivač) na podatke na heap-u i čuva se na steku.

Primer u Swift-u:

// MyObject je klasa (referentni tip), kreirana na heap-u
class MyObject {
    var name: String
    init(name: String) {
        self.name = name
    }
}

func myFunction() {
    // myObject - promenljiva na steku koja čuva referencu
    // na instancu MyObject na heap-u
    let myObject = MyObject(name: "Test")
    // ... korišćenje myObject ...
} // myObject (referenca) se uklanja sa steka pri izlasku iz funkcije
  // Instanca MyObject na heap-u se uništava od strane ARC kada nema više jakih referenci

Slično u Objective-C:

// MyObject je klasa (referentni tip), kreirana na heap-u
@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 - promenljiva na steku koja čuva referencu
    // na instancu MyObject na heap-u
    MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
    // ... korišćenje myObject ...
} // myObject (referenca) se uklanja sa steka pri izlasku iz funkcije
  // Instanca MyObject na heap-u se uništava od strane ARC kada nema više jakih referenci

U oba slučaja, promenljiva myObject je na steku, a sama instanca objekta MyObject je na heap-u. Promenljiva myObject sadrži adresu u memoriji gde se nalazi objekat na heap-u.