Sobes.tech
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 փոփոխականը պարունակում է հիշողության հասցե, որտեղ գտնվում է հողամասի օբյեկտը։