Κοινή χρήση τεχνολογίας

Το isa στο Objective-C δεν είναι πλέον ένας απλός δείκτης δομής

2024-07-12

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

Μάθετε για το Objective-C isa δομή μνήμης δείκτη

Στον στόχο-Γ,isa Οι δείκτες είναι μια σημαντική γέφυρα μεταξύ αντικειμένων και κλάσεων. Όχι μόνο βοηθά το σύστημα χρόνου εκτέλεσης να αναγνωρίσει τον τύπο του αντικειμένου, αλλά συμμετέχει επίσης σε ορισμένες βελτιστοποιήσεις μνήμης και απόδοσης.Αυτό το άρθρο θα εξηγήσει σε βάθοςisa Η δομή της μνήμης των δεικτών, συμπεριλαμβανομένης της εξέλιξής της σε πρώιμες και σύγχρονες υλοποιήσεις.

τι είναι isa δείκτης;

Κάθε αντικείμενο Objective-C έχει ένα isa Ένας δείκτης που δείχνει στο αντικείμενο κλάσης ενός αντικειμένου.Το ίδιο το αντικείμενο της κλάσης είναι επίσης ένα αντικείμενο, και τουisa Ο δείκτης δείχνει σε ένα αντικείμενο μετα-κλάσης.Τα αντικείμενα της Metaclass αποθηκεύουν μεθόδους κλάσης και τουςisa Ο δείκτης δείχνει τελικά στη μετακλάση ρίζας (συνήθωςNSObject μετατάξη).

Νωρίς isa δομή δείκτη

Στις πρώτες υλοποιήσεις του Objective-C,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 δομή δείκτη

Σε συστήματα 64-bit και σύγχρονους χρόνους εκτέλεσης 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 Είτε πρόκειται για τύπο χωρίς δείκτη (βελτιστοποίηση διάταξης μνήμης, αποθήκευση πρόσθετων πληροφοριών).
  • έχει_αναπλ: Εάν το αντικείμενο έχει συσχετισμένες αναφορές (Associative References).
  • has_cxx_dtor: Εάν το αντικείμενο έχει καταστροφέα C++ και ο καταστροφέας πρέπει να κληθεί.
  • shiftcls: Δείκτης κλάσης, ο οποίος αποθηκεύει τις πληροφορίες κλάσης του αντικειμένου (μετά από μετατόπιση και συμπίεση).
  • μαγεία: Μαγικός αριθμός που χρησιμοποιείται για τον εντοπισμό σφαλμάτων και την επαλήθευση χρόνου εκτέλεσης.
  • ασθενώς_αναφέρεται: Εάν το αντικείμενο υποδεικνύεται με αδύναμη αναφορά.
  • αναθέτοντας: Εάν το αντικείμενο απελευθερώνεται.
  • has_sidetable_rc: Εάν το πλήθος αναφοράς του αντικειμένου είναι αποθηκευμένο στον βοηθητικό πίνακα (Side Table).
  • extra_rc: Πρόσθετη καταμέτρηση αναφοράς για βελτιστοποίηση της χρήσης μνήμης.

Αποθήκευση και διαχείριση μετρήσεων αναφοράς

Στις πρώτες υλοποιήσεις του Objective-C, το πλήθος αναφοράς συνήθως αποθηκεύονταν απευθείας στο αντικείμενο ως μέρος της δομής του αντικειμένου. Για παράδειγμα:

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

Στους σύγχρονους χρόνους εκτέλεσης Objective-C, η καταμέτρηση αναφορών γίνεται μέσω 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, από την πρώιμη απλή κατάδειξη σε αντικείμενα κλάσης έως τα σύγχρονα σύνθεταisa_t δομή, η οποία βοηθά στη βελτιστοποίηση της χρήσης και της απόδοσης της μνήμης.καταλαβαίνουνisa Η εξέλιξη των δεικτών και των δομών μνήμης μπορεί να μας βοηθήσει να κατανοήσουμε καλύτερα τον μηχανισμό χρόνου εκτέλεσης του Objective-C και να γράψουμε αποτελεσματικό κώδικα.

Ελπίζω ότι αυτό το άρθρο μπορεί να σας βοηθήσει να αποκτήσετε μια βαθύτερη κατανόηση του Objective-C isa Δομή μνήμης δείκτη. Εάν έχετε οποιεσδήποτε ερωτήσεις ή προτάσεις, αφήστε ένα μήνυμα για συζήτηση.