Teknologian jakaminen

isa Objective-C:ssä ei ole enää yksinkertainen rakenneosoitin

2024-07-12

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

Lisätietoja Objective-C:stä isa osoitinmuistin rakenne

Objective-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.

mikä on 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).

Aikaisin isa osoittimen rakenne

Varhaisissa 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; // 指向父类对象的指针
    // 其他类相关的元数据
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Tämän rakenteen alla:

  • Esine isa Osoitin osoittaa luokkaobjektiin.
  • esinemäinen isa Osoitin osoittaa metaluokan objektiin.
  • metaluokan objekti isa Osoitin osoittaa juuri metaluokan objektiin.

moderni isa osoittimen rakenne

64-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; // 额外的引用计数
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Rakennekentän selitys

  • ei-osoittaja:ohjeita isa Olipa kyseessä ei-osoitintyyppi (optimoi muistiasettelu, tallenna lisätietoja).
  • has_assoc: Onko objektilla siihen liittyviä viittauksia (Associative References).
  • has_cxx_dtor: Onko objektilla C++-destruktori ja pitääkö tuhoaja kutsua.
  • shiftcls: Luokkaosoitin, joka tallentaa kohteen luokkatiedot (siirtymisen ja pakkaamisen jälkeen).
  • taika-: Maaginen numero, jota käytetään virheenkorjaukseen ja ajonaikaiseen todentamiseen.
  • heikosti_viitattu: Osoittaako objekti heikko viittaus.
  • jakaminen: Vapautetaanko kohde.
  • has_sidetable_rc: Tallennetaanko kohteen viitemäärä aputaulukkoon (sivutaulukko).
  • extra_rc: Lisäviitelaskenta muistin käytön optimoimiseksi.

Viitearvojen tallennus ja hallinta

Varhaisissa Objective-C-toteutuksissa viitemäärä tallennettiin yleensä suoraan objektiin osana objektin rakennetta. Esimerkiksi:

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

Nykyaikaisissa Objective-C-ajoissa viitelaskenta tapahtuu kautta isa Optimoitua osoittimien rakennetta ja sivutaulukon aputietorakennetta hallitaan.

  • Sisäänrakennettu viitelaskenta: Osittainen viitelaskentatiedot on tallennettu isa Optimoiduissa osoittimien rakenteissa, esim.extra_rc ala.
  • Sivupöytä: kun viitemäärä ylittää isa Kun alue, jota osoitin voi edustaa, viitemäärä tallennetaan aputietorakenteeseen nimeltä Side Table.

Moderni isa Osoittimien edut

  • Muistin optimointi: Tallentamalla lisää tietoa (kuten viitemäärät, liput) sisään isa Osoittimissa pääsy muihin muistialueisiin vähenee ja suorituskyky paranee.
  • Suorituskyvyn parannuksia: Muistin lukutoiminnot vähenevät, koska yhdellä muistin lukukerralla voidaan saada enemmän tietoa.
  • Rikkaammat metatiedot: Voi sisältää enemmän ajonaikaista tietoa, mikä auttaa parantamaan suoritusajan joustavuutta ja tehokkuutta.

Käyttöesimerkki

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Tee yhteenveto

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.