Berbagi teknologi

isa di Objective-C bukan lagi penunjuk struktur sederhana

2024-07-12

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

Pelajari tentang Objective-C isa struktur memori penunjuk

Di Objective-C,isa Pointer adalah jembatan penting antara objek dan kelas. Ini tidak hanya membantu sistem runtime mengidentifikasi jenis objek, tetapi juga berpartisipasi dalam beberapa optimasi memori dan kinerja.Artikel ini akan menjelaskan secara mendalamisa Struktur memori pointer, termasuk evolusinya dalam implementasi awal dan modern.

apa isa penunjuk?

Setiap objek Objective-C memiliki a isa Sebuah pointer yang menunjuk ke objek kelas suatu objek.Objek kelas itu sendiri juga merupakan objek, dan miliknyaisa Pointer menunjuk ke objek kelas meta.Objek metaclass menyimpan metode kelas, dan miliknyaisa Pointer pada akhirnya menunjuk ke metaclass root (biasanyaNSObject metakelas).

Lebih awal isa struktur penunjuk

Pada awal implementasi Objective-C,isa Pointer hanya menunjuk ke struktur objek kelas. Berikut adalah contoh implementasi awal yang khas:

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

Di bawah struktur ini:

  • Obyek isa Pointer menunjuk ke objek kelas.
  • seperti objek isa Pointer menunjuk ke objek metaclass.
  • objek metakelas isa Pointer menunjuk ke objek metaclass root.

modern isa struktur penunjuk

Pada sistem 64-bit dan runtime Objective-C modern,isa Pointer didesain ulang sebagai gabungan yang lebih kompleks (union isa_t ), yang tidak hanya berisi pointer ke objek kelas, tetapi juga tanda dan informasi lain untuk mengoptimalkan penggunaan dan kinerja memori.Berikut ini adalahisa_t Contoh struktur yang disederhanakan:

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

Penjelasan bidang struktur

  • tidak menunjuk:menginstruksikan isa Baik itu tipe non-pointer (mengoptimalkan tata letak memori, menyimpan informasi tambahan).
  • memiliki_asosiasi: Apakah objek mempunyai referensi terkait (Referensi Asosiatif).
  • memiliki_cxx_dtor: Apakah objek memiliki destruktor C++ dan destruktor tersebut perlu dipanggil.
  • shiftcls: Penunjuk kelas, yang menyimpan informasi kelas objek (setelah perpindahan dan kompresi).
  • sihir: Nomor ajaib yang digunakan untuk debugging dan verifikasi runtime.
  • referensi lemah: Apakah objek tersebut ditunjuk oleh referensi yang lemah.
  • dealokasi: Apakah objek sedang dilepaskan.
  • memiliki_meja_samping_rc: Apakah jumlah referensi objek disimpan di tabel bantu (Tabel Samping).
  • ekstra_rc: Penghitungan referensi tambahan untuk mengoptimalkan penggunaan memori.

Penyimpanan dan pengelolaan jumlah referensi

Pada awal implementasi Objective-C, jumlah referensi biasanya disimpan langsung di objek sebagai bagian dari struktur objek. Misalnya:

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

Dalam runtime Objective-C modern, penghitungan referensi terjadi melalui isa Struktur pointer yang dioptimalkan dan struktur data tambahan Tabel Samping dikelola.

  • Penghitungan Referensi Sebaris: Informasi penghitungan referensi parsial disimpan di isa Dalam struktur pointer yang dioptimalkan, mis.extra_rc bidang.
  • Meja samping: ketika jumlah referensi melebihi isa Ketika rentang yang dapat diwakili oleh penunjuk, jumlah referensi disimpan dalam struktur data tambahan yang disebut Tabel Samping.

Modern isa Keuntungan dari pointer

  • Optimalisasi memori: Dengan menyimpan lebih banyak informasi (seperti jumlah referensi, bendera) di isa Di pointer, akses ke area memori lain dikurangi dan kinerja ditingkatkan.
  • Peningkatan kinerja: Operasi pembacaan memori berkurang karena lebih banyak informasi dapat diperoleh dalam satu pembacaan memori.
  • Metadata yang lebih kaya: Dapat berisi lebih banyak informasi runtime, membantu meningkatkan fleksibilitas dan efisiensi runtime.

Contoh penggunaan

Meski pengembang seringkali tidak berinteraksi langsung dengannya isa Pointer berinteraksi, tetapi memahami strukturnya berguna untuk melakukan debug dan mengoptimalkan kinerja. Berikut adalah contoh penggunaan yang menampilkan tipe suatu objek dengan mengakses informasi kelasnya:

#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

Meringkaskan

isa Pointer memainkan peran penting dalam runtime Objective-C, mulai dari penunjukan sederhana awal hingga objek kelas hingga kompleks modernisa_t struktur, yang membantu mengoptimalkan penggunaan dan kinerja memori.memahamiisa Evolusi pointer dan struktur memori dapat membantu kita lebih memahami mekanisme runtime Objective-C dan menulis kode yang efisien.

Saya harap artikel ini dapat membantu Anda mendapatkan pemahaman lebih dalam tentang Objective-C isa Struktur memori penunjuk. Jika Anda memiliki pertanyaan atau saran, silakan tinggalkan pesan untuk berdiskusi.