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.