Middle
Kas väärtus võib olla virnas ja viide virnas? Selgitage oma vaadet.
sobes.tech AI
Vastus AI-lt
Jah, see on standardkäitumine.
- Katt: Hoidab kohalikke muutujad ja objektidele viited. Katt on seotud funktsiooni või koodiploki vahemikuga ning andmetele juurdepääs on kiire.
- Hajus (Heap): Hoidab dünaamiliselt loodud objekte. Haisu andmete eluea ei ole seotud vahemikuga ning seda haldab mäluhalduse mehhanism (ARC iOS-is). Andmetele juurdepääs on aeglasem kui kattel.
Kui me loome Swiftis klassi objekti (näiteks), siis objekt ise paikneb hajus. Muutuja, mille me selle objekti jaoks deklareerime, on põhimõtteliselt viide (viide) hajus asuvale andmetele ja hoitakse kattel.
Swift näide:
// MyObject — klass (viidetüüp), paikneb hajus
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func myFunction() {
// myObject — kattel paiknev muutuja, mis hoiab viidet
// MyObject eksemplarile
let myObject = MyObject(name: "Test")
// ... kasutamine myObject ...
} // myObject (viide) eemaldatakse funktsiooni väljudes
// MyObject eksemplar hävib ARC-i poolt, kui tugevad viited puuduvad
Sarnaselt Objective-C:
// MyObject — klass (viidetüüp), paikneb hajus
@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 — kattel paiknev muutuja, mis hoiab viidet
// MyObject eksemplarile
MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
// ... kasutamine myObject ...
} // myObject (viide) eemaldatakse funktsiooni väljudes
// MyObject eksemplar hävib ARC-i poolt, kui tugevad viited puuduvad
Mõlemas olukorras asub myObject muutuja kattel ning ise MyObject objekt — hajus. myObject sisaldab mälu aadressi, kus asub hajus olev objekt.