Middle
Կարող է արժեքը լինել հոսպիտալում, իսկ հղումը՝ ստեկում? բացատրեք ձեր տեսակետը։
sobes.tech AI
Պատասխան AI-ից
Այո, սա ստանդարտ վարքագիծ է:
- Տեղ: Պահպանում է տեղական փոփոխականները և օբյեկտների հղումները։ Տեղի տվյալների կյանքի տևողությունը կապված է ֆունկցիայի կամ կոդի բլոկի շրջանակի հետ։ Մուտք գործել տվյալների արագ է։
- Հավաք (Heap): Պահպանում է դինամիկորեն ստեղծված օբյեկտները։ Հավաքի տվյալների կյանքի տևողությունը չի կապված շրջանակի հետ և կառավարվում է հիշողության կառավարման մեխանիզմով (ARC iOS-ում): Մուտք գործել տվյալների ավելի դանդաղ է, քան տախտակամածում:
Երբ մենք ստեղծում ենք դասի օբյեկտ Swift-ում (օրինակ), ինքն օբյեկտը տեղադրվում է հողամասում։ Փոփոխականը, որը մենք հայտարարում ենք այդ օբյեկտը պահելու համար, հիմնականում հղում է (ցուցակ) հողամասի տվյալների վրա և պահվում է տախտակամածում։
Swift-ի օրինակ:
// MyObject — դաս (հղումային տեսակ), տեղադրված է հողամասում
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func myFunction() {
// myObject — տախտակամածում գտնվող փոփոխական, որը պահում է հղում
// MyObject օրինակին հղում
let myObject = MyObject(name: "Test")
// ... օգտագործում myObject ...
} // myObject (հղում) հեռացվում է տախտակամածից ֆունկցիայից դուրս գալու ժամանակ
// MyObject օրինակն հողամասում ոչնչացվում է ARC-ի կողմից, երբ այլ ուժեղ հղումներ չկան
Անալոգ՝ Objective-C-ում:
// MyObject — դաս (հղումային տեսակ), տեղադրված է հողամասում
@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 — տախտակամածում գտնվող փոփոխական, որը պահում է հղում
// MyObject օրինակին հղում
MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
// ... օգտագործում myObject ...
} // myObject (հղում) հեռացվում է տախտակամածից ֆունկցիայից դուրս գալու ժամանակ
// MyObject օրինակն հողամասում ոչնչացվում է ARC-ի կողմից, երբ այլ ուժեղ հղումներ չկան
Երկու դեպքերում myObject փոփոխականը գտնվում է տախտակամածում, իսկ MyObject օբյեկտը — հողամասում։ myObject փոփոխականը պարունակում է հիշողության հասցե, որտեղ գտնվում է հողամասի օբյեկտը։