Sobes.tech
Middle

Lehet-e az érték a halomban, és a hivatkozás a veremben? Magyarázza el a nézőpontját.

sobes.tech MI

Válasz az MI-től

Igen, ez egy standard viselkedés.

  • Verem (Stack): Tárolja a helyi változókat és mutatókat (referenciákat) az objektumokra. A veremben lévő adatok élettartama a függvény vagy kódrészlet scope-jához kötött. Az adatokhoz való hozzáférés gyors.
  • Heap (Kupac): Dinamikusan létrehozott objektumokat tárol. A heapen lévő adatok élettartama nem kötött a scope-hoz, és a memóriakezelő mechanizmus (ARC iOS-en) kezeli. Az adatokhoz való hozzáférés lassabb, mint a veremben.

Amikor például Swift-ben osztályobjektumot hozunk létre, maga az objektum a heapen helyezkedik el. A változó, amit az objektum tárolására deklarálunk, lényegében egy referencia (mutató) a heapen lévő adatokra, és a veremben tárolódik.

Swift példával:

// MyObject egy osztály (referencia típus), amely a heapen jön létre
class MyObject {
    var name: String
    init(name: String) {
        self.name = name
    }
}

func myFunction() {
    // myObject - változó a veremben, amely a referencia tárolja
    // a MyObject példányára a heapen
    let myObject = MyObject(name: "Test")
    // ... myObject használata ...
} // myObject (referencia) törlődik a veremből a függvény kilépésekor
  // A MyObject példány a heapen ARC által törlődik, amikor már nincs erős referencia

Hasonló Objective-C-ben:

// MyObject egy osztály (referencia típus), amely a heapen jön létre
@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 - változó a veremben, amely a referencia tárolja
    // a MyObject példányára a heapen
    MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
    // ... myObject használata ...
} // myObject (referencia) törlődik a veremből a függvény kilépésekor
  // A MyObject példány a heapen ARC által törlődik, amikor már nincs erős referencia

Mindkét esetben a myObject változó a veremben található, míg a MyObject objektum maga a heapen. A myObject változó tartalmazza a memóriacímet, ahol az objektum a heapen található.