2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
isa
osoitinmuistin rakenneObjective-C:ssäisa
Osoittimet ovat tärkeä silta objektien ja luokkien välillä. Se ei vain auta ajonaikaista järjestelmää tunnistamaan objektin tyyppiä, vaan osallistuu myös joihinkin muistin ja suorituskyvyn optimointiin.Tämä artikkeli selittää perusteellisestiisa
Osoittimien muistirakenne, mukaan lukien sen kehitys varhaisissa ja nykyaikaisissa toteutuksissa.
isa
osoitin?Jokaisella Objective-C-objektilla on a isa
Osoitin, joka osoittaa objektin luokkaobjektiin.Luokkaobjekti itsessään on myös objekti, ja senisa
Osoitin osoittaa metaluokan objektiin.Metaluokkaobjektit tallentavat luokkametodeja ja niidenisa
Osoitin osoittaa lopulta juuri metaluokkaan (yleensäNSObject
metaluokka).
isa
osoittimen rakenneVarhaisissa Objective-C-toteutuksissaisa
Osoitin yksinkertaisesti osoittaa luokkaobjektien rakenteeseen. Tässä on tyypillinen esimerkki varhaisesta toteutuksesta:
struct objc_object {
Class isa; // 指向类对象的指针
};
typedef struct objc_class *Class; // Class 的本质是 objc_class 类型的结构体指针
struct objc_class {
Class isa; // 指向元类对象的指针
Class super_class; // 指向父类对象的指针
// 其他类相关的元数据
};
Tämän rakenteen alla:
isa
Osoitin osoittaa luokkaobjektiin.isa
Osoitin osoittaa metaluokan objektiin.isa
Osoitin osoittaa juuri metaluokan objektiin.isa
osoittimen rakenne64-bittisissä järjestelmissä ja nykyaikaisissa Objective-C-ajoympäristöissäisa
Osoittimet suunniteltiin uudelleen monimutkaisemmaksi liitoksi (union isa_t
), joka sisältää paitsi osoittimia luokkaobjekteihin, myös muita lippuja ja tietoja muistin käytön ja suorituskyvyn optimoimiseksi.Seuraava onisa_t
Yksinkertaistettu esimerkki rakenteesta:
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
Olipa kyseessä ei-osoitintyyppi (optimoi muistiasettelu, tallenna lisätietoja).Varhaisissa Objective-C-toteutuksissa viitemäärä tallennettiin yleensä suoraan objektiin osana objektin rakennetta. Esimerkiksi:
struct objc_object {
Class isa; // 指向类对象的指针
uintptr_t retainCount; // 引用计数
};
Nykyaikaisissa Objective-C-ajoissa viitelaskenta tapahtuu kautta isa
Optimoitua osoittimien rakennetta ja sivutaulukon aputietorakennetta hallitaan.
isa
Optimoiduissa osoittimien rakenteissa, esim.extra_rc
ala.isa
Kun alue, jota osoitin voi edustaa, viitemäärä tallennetaan aputietorakenteeseen nimeltä Side Table.isa
Osoittimien edutisa
Osoittimissa pääsy muihin muistialueisiin vähenee ja suorituskyky paranee.Vaikka kehittäjät eivät useinkaan ole suoraan vuorovaikutuksessa isa
Osoittimet toimivat vuorovaikutuksessa, mutta niiden rakenteen ymmärtäminen auttaa virheenkorjauksessa ja suorituskyvyn optimoinnissa. Tässä on käyttöesimerkki, joka näyttää objektin tyypin käyttämällä sen luokkatietoja:
#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
Osoittimilla on tärkeä rooli Objective-C-ajon aikana varhaisesta yksinkertaisesta osoittamisesta luokkaobjekteihin nykyaikaiseen kompleksiin.isa_t
rakenne, joka auttaa optimoimaan muistin käytön ja suorituskyvyn.ymmärtääisa
Osoittimien ja muistirakenteiden kehitys voi auttaa meitä ymmärtämään paremmin Objective-C:n ajonaikaisen mekanismin ja kirjoittamaan tehokkaan koodin.
Toivon, että tämä artikkeli auttaa sinua ymmärtämään Objective-C:tä paremmin isa
Osoittimen muistin rakenne. Jos sinulla on kysyttävää tai ehdotuksia, jätä viesti keskustelua varten.