τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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; // 指向父类对象的指针
// 其他类相关的元数据
};
Κάτω από αυτή τη δομή:
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; // 额外的引用计数
};
};
isa
Είτε πρόκειται για τύπο χωρίς δείκτη (βελτιστοποίηση διάταξης μνήμης, αποθήκευση πρόσθετων πληροφοριών).Στις πρώτες υλοποιήσεις του Objective-C, το πλήθος αναφοράς συνήθως αποθηκεύονταν απευθείας στο αντικείμενο ως μέρος της δομής του αντικειμένου. Για παράδειγμα:
struct objc_object {
Class isa; // 指向类对象的指针
uintptr_t retainCount; // 引用计数
};
Στους σύγχρονους χρόνους εκτέλεσης 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;
}
isa
Οι δείκτες διαδραματίζουν σημαντικό ρόλο στο χρόνο εκτέλεσης του Objective-C, από την πρώιμη απλή κατάδειξη σε αντικείμενα κλάσης έως τα σύγχρονα σύνθεταisa_t
δομή, η οποία βοηθά στη βελτιστοποίηση της χρήσης και της απόδοσης της μνήμης.καταλαβαίνουνisa
Η εξέλιξη των δεικτών και των δομών μνήμης μπορεί να μας βοηθήσει να κατανοήσουμε καλύτερα τον μηχανισμό χρόνου εκτέλεσης του Objective-C και να γράψουμε αποτελεσματικό κώδικα.
Ελπίζω ότι αυτό το άρθρο μπορεί να σας βοηθήσει να αποκτήσετε μια βαθύτερη κατανόηση του Objective-C isa
Δομή μνήμης δείκτη. Εάν έχετε οποιεσδήποτε ερωτήσεις ή προτάσεις, αφήστε ένα μήνυμα για συζήτηση.