Middle
Ar gali reikšmė būti krūvoje, o nuoroda – steke? Paaiškinkite savo požiūrį.
sobes.tech AI
Atsakymas iš AI
Taip, tai yra standartinis elgesys.
- Erdvė: Saugo vietinius kintamuosius ir objektų nuorodas. Eilės gyvavimo laikas yra susijęs su funkcijos arba kodo bloko apimtimi. Prieiga prie duomenų yra greita.
- Kaupė (Heap): Saugo dinamiškai sukurtus objektus. Kaukės duomenų gyvavimo laikas nėra susijęs su apimtimi ir valdomas atminties valdymo mechanizmo (ARC iOS). Prieiga prie duomenų yra lėtesnė nei eilėje.
Kai kuriame klasės objektą Swift'e (pavyzdžiui), pats objektas yra išdėstytas kaukėje. Kintamasis, kurį deklaruojame šio objekto saugojimui, iš esmės yra nuoroda (nuoroda) į duomenis kaukėje ir saugomas eilėje.
Swift pavyzdys:
// MyObject — klasė (nuorodinis tipas), išdėstyta kaukėje
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func myFunction() {
// myObject — eilėje esantis kintamasis, saugantis nuorodą
// į MyObject egzempliorių
let myObject = MyObject(name: "Test")
// ... naudojimas myObject ...
} // myObject (nuoroda) išnyksta iš eilės išėjus iš funkcijos
// MyObject egzempliorius naikinamas ARC, kai nėra stiprių nuorodų
Panašiai Objective-C:
// MyObject — klasė (nuorodinis tipas), išdėstyta kaukėje
@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 — eilėje esantis kintamasis, saugantis nuorodą
// į MyObject egzempliorių
MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
// ... naudojimas myObject ...
} // myObject (nuoroda) išnyksta iš eilės išėjus iš funkcijos
// MyObject egzempliorius naikinamas ARC, kai nėra stiprių nuorodų
Abiem atvejais myObject kintamasis yra eilėje, o pats MyObject objektas — kaukėje. myObject saugo atminties adresą, kuriame yra kaukės objektas.