प्रौद्योगिकी साझेदारी

Objective-C इत्यस्मिन् isa इत्येतत् सरलं संरचनासूचकं नास्ति

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

उद्देश्य-C विषये ज्ञातव्यम् isa सूचकस्मृतिसंरचना

उद्देश्य-ग, ९.isa सूचकाः वस्तुनां वर्गानां च मध्ये महत्त्वपूर्णः सेतुः भवति । इदं न केवलं रनटाइम् सिस्टम् इत्यस्य वस्तुप्रकारस्य परिचये सहायकं भवति, अपितु केषुचित् स्मृति-प्रदर्शन-अनुकूलनेषु अपि भागं गृह्णाति ।अयं लेखः गभीरतया व्याख्यास्यतिisa सूचकानाम् स्मृतिसंरचना, यत्र प्रारम्भिकेषु आधुनिककार्यन्वयनेषु तस्य विकासः अपि अस्ति ।

किमस्ति isa सूचकः?

प्रत्येकं Objective-C वस्तुनः a isa एकः सूचकः यः वस्तुनः वर्गवस्तुं सूचयति ।वर्गवस्तु स्वयं अपि वस्तु, तस्य चisa सूचकः मेटा-वर्गस्य वस्तुं दर्शयति ।मेटाक्लास् ऑब्जेक्ट्स् क्लास मेथड् सञ्चयन्ति, तेषां च...isa सूचकः अन्ततः मूलमेटाक्लास् (प्रायःNSObject मेटाक्लास)।

शीघ्रम्‌ isa सूचक संरचना

प्रारम्भिक उद्देश्य-ग कार्यान्वयनयोः, २.isa सूचकः केवलं वर्गवस्तूनाम् एकं संरचनां दर्शयति । अत्र एकं विशिष्टं प्रारम्भिकं कार्यान्वयनम् उदाहरणम् अस्ति :

struct objc_object {
    Class isa; // 指向类对象的指针
};

typedef struct objc_class *Class; // Class 的本质是 objc_class 类型的结构体指针
struct objc_class {
    Class isa; // 指向元类对象的指针
    Class super_class; // 指向父类对象的指针
    // 其他类相关的元数据
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

अस्याः संरचनायाः अन्तर्गतं : १.

  • वस्तु isa सूचकः वर्गस्य वस्तुं प्रति सूचयति ।
  • वस्तुसदृशः isa सूचकः मेटाक्लास् ऑब्जेक्ट् प्रति सूचयति ।
  • मेटाक्लास वस्तु isa सूचकः मूलमेटाक्लास् वस्तुं प्रति सूचयति ।

आधुनिक isa सूचक संरचना

६४-बिट्-प्रणालीषु आधुनिक-Objective-C रनटाइम्षु च,isa सूचकाः अधिकजटिलसङ्घरूपेण पुनः परिकल्पिताः (union isa_t ), यस्मिन् न केवलं वर्ग-वस्तूनाम् सूचकाः सन्ति, अपितु स्मृति-उपयोगं कार्यक्षमतां च अनुकूलितुं अन्ये ध्वजाः सूचनाः च सन्ति ।निम्नलिखितम् अस्तिisa_t संरचनायाः सरलीकृतं उदाहरणं : १.

union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls; // 指向类对象的指针
    uintptr_t bits; // 包含位域信息的位模式

    struct {
        uintptr_t nonpointer        : 1;  // 是否启用优化的 non-pointer isa
        uintptr_t has_assoc         : 1;  // 是否有关联对象
        uintptr_t has_cxx_dtor      : 1;  // 是否有 C++ 析构函数
        uintptr_t shiftcls          : 33; // 类指针(经过位移和压缩)
        uintptr_t magic             : 6;  // 调试用的魔数
        uintptr_t weakly_referenced : 1;  // 是否被弱引用
        uintptr_t deallocating      : 1;  // 是否正在释放
        uintptr_t has_sidetable_rc  : 1;  // 是否有辅助引用计数表
        uintptr_t extra_rc          : 19; // 额外的引用计数
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

संरचना क्षेत्र व्याख्या

  • असूचकः:निर्देशं करोति isa किं सः अ-सूचकप्रकारः अस्ति (स्मृतिविन्यासं अनुकूलितं कुर्वन्तु, अतिरिक्तसूचनाः संग्रहयन्तु) ।
  • has_assoc: वस्तुनः सम्बद्धाः सन्दर्भाः सन्ति वा (Associative References)।
  • has_cxx_dtor इति: वस्तुनः C++ विध्वंसकः अस्ति वा, विध्वंसकस्य आह्वानस्य आवश्यकता अस्ति वा।
  • शिफ्टक्ल्स्: Class pointer, यत् वस्तुनः class information (विस्थापनस्य संपीडनस्य च अनन्तरं) संग्रहयति ।
  • जादू: त्रुटिनिवारणाय, रनटाइम् सत्यापनाय च प्रयुक्ता जादूसङ्ख्या ।
  • दुर्बल_सन्दर्भित: वस्तु दुर्बलसन्दर्भेण सूचितं वा।
  • विनियोजनम्: वस्तु मुक्तं भवति वा।
  • has_sidetable_rc: वस्तुनः सन्दर्भगणना सहायकसारणीयां (Side Table) संगृहीता अस्ति वा।
  • अतिरिक्त_rc: स्मृतिप्रयोगस्य अनुकूलनार्थं अतिरिक्तसन्दर्भगणना।

सन्दर्भगणनायाः भण्डारणं प्रबन्धनं च

प्रारम्भिकेषु Objective-C कार्यान्वयनेषु, सन्दर्भगणना प्रायः वस्तुनः संरचनायाः भागरूपेण प्रत्यक्षतया वस्तुनि संगृहीता आसीत् । उदाहरणतया:

struct objc_object {
    Class isa; // 指向类对象的指针
    uintptr_t retainCount; // 引用计数
};
  • 1
  • 2
  • 3
  • 4

आधुनिक Objective-C रनटाइम्स् मध्ये सन्दर्भगणना via... isa सूचकानाम् अनुकूलितसंरचना तथा Side Table सहायकदत्तांशसंरचना प्रबन्धिता भवति ।

  • इनलाइन सन्दर्भ गणना: आंशिकसन्दर्भगणनासूचना अस्मिन् संगृहीता भवति isa सूचकानाम् अनुकूलितसंरचनासु, उदा.extra_rc क्षेत्रम्‌।
  • पार्श्व तालिका: यदा सन्दर्भगणना अतिक्रमति isa यदा सूचकः यत् परिधिं प्रतिनिधितुं शक्नोति तदा सन्दर्भगणना Side Table इति सहायकदत्तांशसंरचने संगृह्यते ।

आधुनिक isa सूचकानाम् लाभाः

  • स्मृति अनुकूलन: अधिकानि सूचनानि (यथा सन्दर्भगणना, ध्वजाः) मध्ये संग्रह्य isa सूचकेषु अन्यस्मृतिक्षेत्रेषु प्रवेशः न्यूनीकरोति, कार्यक्षमतां च सुदृढं भवति ।
  • कार्यप्रदर्शनसुधारः: स्मृतिपठनक्रियाः न्यूनीभवन्ति यतोहि एकस्मिन् स्मृतिपठने अधिकानि सूचनानि प्राप्तुं शक्यन्ते ।
  • समृद्धतर मेटाडाटा: अधिकानि रनटाइम् सूचनां समाविष्टुं शक्नोति, यत् रनटाइम् लचीलतां कार्यक्षमतां च सुधारयितुम् सहायकं भवति ।

प्रयोगोदाहरणम्

यद्यपि विकासकाः प्रायः प्रत्यक्षतया सह अन्तरक्रियां न कुर्वन्ति isa सूचकाः अन्तरक्रियां कुर्वन्ति, परन्तु तेषां संरचनायाः अवगमनं त्रुटिनिवारणाय, कार्यक्षमतायाः अनुकूलनार्थं च सहायकं भवति । अत्र एकं उपयोगोदाहरणं अस्ति यत् वस्तुनः वर्गसूचनाम् अभिगत्य तस्य प्रकारं प्रदर्शयति ।

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MyClass : NSObject
@end

@implementation MyClass
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *obj = [[MyClass alloc] init];
        Class cls = object_getClass(obj);
        NSLog(@"Class name: %s", class_getName(cls));
        
        // 访问 isa 指针信息(需要通过运行时函数)
        NSLog(@"isa pointer: %p", *(uintptr_t *)obj);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

सारांशं कुरुत

isa Objective-C runtime इत्यस्मिन् सूचकाः महत्त्वपूर्णां भूमिकां निर्वहन्ति, प्रारम्भिकसरलसूचनात् आरभ्य वर्गवस्तूनाम् आधुनिकजटिलपर्यन्तंisa_t संरचना, यत् स्मृति-उपयोगं कार्यक्षमतां च अनुकूलितुं साहाय्यं करोति ।अवबोधनम्‌isa सूचकानाम् स्मृतिसंरचनानां च विकासः अस्मान् Objective-C इत्यस्य रनटाइम् तन्त्रं अधिकतया ग्रहीतुं कुशलं कोडं लिखितुं च साहाय्यं कर्तुं शक्नोति ।

आशासे यत् एषः लेखः भवद्भ्यः Objective-C इत्यस्य गहनतया अवगमनं प्राप्तुं साहाय्यं कर्तुं शक्नोति isa सूचक स्मृति संरचना। यदि भवतः किमपि प्रश्नं वा सुझावः वा अस्ति तर्हि चर्चायै सन्देशं त्यजन्तु।