Automatikus referenciaszámlálás - Automatic Reference Counting
Az automatikus referenciaszámlálás ( ARC ) a Clang fordító memóriakezelő szolgáltatása, amely automatikusan referenciaszámlálót nyújt az Objective-C és a Swift programozási nyelvek számára . Összeállítási időben beilleszti az objektumkód üzenetekbe , amelyek növelik és csökkentik a referenciaszámot futási időnként, megjelölve az objektumok üzlethelyezését , amikor az ezekre mutató hivatkozások száma eléri a nullát.
retainrelease
Az ARC abban különbözik a hulladékgyűjtés nyomon követésétől , hogy nincs háttérfolyamat, amely az objektumokat szinkron módon osztja el futás közben. A szemétgyűjtéssel ellentétben az ARC nem kezeli automatikusan a referenciaciklusokat . Ez azt jelenti, hogy mindaddig, amíg az objektumra "erõs" hivatkozások léteznek, addig nem osztják el azt. Az erõs kereszthivatkozások ennek megfelelõen holtpontokat és memóriaszivárogásokat eredményezhetnek . A fejlesztő feladata a ciklusok megszakítása gyenge hivatkozások használatával .
Az Apple Inc. telepíti az ARC-t operációs rendszerükben, mint például a macOS ( OS X ) és az iOS . Korlátozott támogatás (ARCLite) érhető el a Mac OS X Snow Leopard és iOS 4 óta , a Mac OS X Lion és iOS 5 teljes támogatását követően . A szemétszedést elavultnak nyilvánították az OS X Mountain Lion-ban , az ARC javára, és eltávolították az Objective-C futtatóidejű könyvtárából a macOS Sierra-ban .
tartalom
Objective-C
A következő szabályokat a fordító hajtja végre, amikor az ARC be van kapcsolva:
-
retain,release,retainCount,autoreleaseVagydeallocnem lehet elküldeni a tárgyakat. Ehelyett a fordító automatikusan beszúrja ezeket az üzeneteket a fordítás idejére, ideértve azt is,[super dealloc]amikordeallocfelülbírálják.
// Without ARC
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
// With ARC
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
// [super dealloc] is called automatically
}
- A programok nem közvetíthetnek közvetlenül a
idés a közöttvoid *. Ez magában foglalja az casting az Alapítvány objektumok és a Core Alapítvány objektumok között.
- A programoknak speciális cast-okat vagy speciális funkciókra való hívásokat kell használniuk, hogy a fordítónak több információt kapjanak az objektum élettartamáról.
// Without ARC
- (NSString *)giveMeAString
{
CFStringRef myString = [self someMethodThatCreatesACFString];
NSString *newString = (NSString *)myString;
return [newString autorelease];
}
// With ARC
- (NSString *)giveMeAString
{
CFStringRef myString = [self someMethodThatCreatesACFString]; // retain count is 1
NSString *newString = (__bridge_transfer NSString *)myString; // the ownership has now been transferred into ARC
return newString;
}
- Az automatikus kioldású készlet felhasználható az objektumok ideiglenes kiosztására és a memóriában való megtartására, amíg a készlet „kiürül”. ARC nélkül egy
NSAutoreleasePoolobjektum létrehozható erre a célra. Az ARC@autoreleasepoolhelyett blokkokat használ, amelyek beágyazzák az ideiglenes objektumok allokációját és foglalkoznak velük, amikor a blokk vége eléri.
// Without ARC
- (void)loopThroughArray:(NSArray *)array
{
for (id object in array) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Create a lot of temporary objects
[pool drain];
}
}
// With ARC
- (void)loopThroughArray:(NSArray *)array
{
for (id object in array) {
@autoreleasepool {
// Create a lot of temporary objects
}
}
}
- A programok nem hívhatják meg a funkciókat
NSAllocateObjectésNSDeallocateObject - Programok nem használható objektum mutatókat C struktúrák (
structok) - A programok nem használhatnak memória zónákat (
NSZone) - A nem ARC-kóddal való megfelelő együttműködés érdekében a programoknak nem szabad metódust vagy deklarált tulajdonságot használniuk (kivéve, ha kifejezetten egy másik gettert választunk), amely kezdődik
new.
Vagyonnyilatkozatok
Az ARC bevezet néhány új tulajdonságnyilatkozat-attribútumot, amelyek közül néhány a régi attribútumokat váltja fel.
| ARC nélkül | ARC-vel | Az ARCLite segítségével |
|---|---|---|
retain |
strong
|
|
assign (objektumtípusoknál) |
weak |
unsafe_unretained
|
copy
| ||
A gyenge referenciák nullázása
A gyenge referenciák nullázása olyan funkció, amely az Objective-C ARC-ben automatikusan törli (beállítja nil) a gyenge referenciaszámú helyi változókat, a példányváltozókat és a deklarált tulajdonságokat közvetlenül azelőtt, hogy az objektum, amelyre mutat, a keresés megkezdése. Ez biztosítja, hogy a mutató egy érvényes objektumhoz megy, vagy pedig nilelkerüli a mutatók lógását . A szolgáltatás bevezetése előtt a "gyenge referenciák" olyan hivatkozásokra utaltak, amelyek nem maradtak meg, de nem álltak be nilabban a pontban , amikor a tárgyuk, amelyre rámutattak, üzlethelyzetben volt (egyenértékű unsafe_unretainedaz ARC-ben), így esetleg függő mutatót eredményeztek. A programozónak általában gondoskodnia kellett arról, hogy az objektum minden lehetséges gyenge hivatkozása manuálisan nullára legyen állítva, amikor az üzlethelyzetbe kerül. A gyenge referenciák nullázása kiküszöböli ennek szükségességét.
A nullázó gyenge hivatkozásokat a deklarált tulajdonság attribútum weak vagy a változó attribútum használatával jelöljük __weak.
A nullázó gyenge referenciák csak a Mac OS X Lion (10.7) vagy újabb és iOS 5 vagy újabb verziókban érhetők el, mert kiegészítő támogatást igényelnek az Objective-C futtatóidejétől. Néhány OS X osztály azonban jelenleg nem támogatja a gyenge referenciákat. Az ARC-t használó, de a fentieknél régebbi verziókat támogató kód nem használhat nullázó gyenge referenciákat, ezért unsafe_unretainedgyenge hivatkozásokat kell használnia . Létezik egy harmadik féltől származó PLWeakCompatibility [1] nevű könyvtár, amely lehetővé teszi a gyenge referenciák nullázását még a régebbi operációs rendszerek verzióinál is.
Konvertálás
Az Xcode 4.2 vagy újabb verziók biztosítják a kód ARC-re konvertálását. Az Xcode 4.5 verziójától a Szerkesztés> Refaktor> Átalakítás Objective-C ARC-ként választásával ... Bár az Xcode automatikusan konvertálja a legtöbb kódot, előfordulhat, hogy néhány kódot manuálisan kell konvertálni. Az Xcode tájékoztatja a fejlesztőt, ha összetettebb felhasználási esetek merülnek fel, például amikor egy változót deklarálnak egy automatikus kioldókészletben és használják azon kívül, vagy amikor két objektumot díjmentesen kell áthidalni speciális öntésekkel.
Gyors
Swift-ben az objektumokra való hivatkozások erősek, kivéve, ha azokat deklarálták weakvagy unowned. A Swift megköveteli a nulla kifejezett kezelését az Opcionális típussal: olyan érték típus, amelynek lehet értéke vagy nulla. Az Opcionális típust úgy kell kezelni, hogy azt feltételes kijelentéssel "kibontja", és lehetővé teszi az érték biztonságos használatát, ha van. Ezzel szemben bármely nem opcionális típusnak mindig lesz értéke és nem lehet nulla.
var myString: String // Can only be a string
var myOtherString: String? // Can be a string or nil
if let myString = myOtherString { // Unwrap the Optional
print(myString) // Print the string, if present
}
Ennek megfelelően egy objektumra való erős utalás nem lehet Opcionális típusú, mivel az objektumot addig kell a halomban tartani, amíg maga a referencia el nem osztódik. A gyenge referencia típusa opcionális, mivel az objektum elosztható és a referencia nullára állítható. A nem ismert referenciák közt esnek; nem erősek és nem választhatóak. Ehelyett a fordító azt feltételezi, hogy az objektum, amelyhez nem ismert referenciapontok nem kerülnek elosztásra, mindaddig, amíg maga a referencia marad hozzárendelve. Ezt általában olyan helyzetekben használják, amikor a célobjektum hivatkozik az objektumra, amely a nem ismert referenciát tartja.
var strongReference: MyClass // Strong reference, cannot be nil
weak var weakReference: MyClass? // Weak reference, can be nil
unowned var unownedReference: MyClass // Weak reference, cannot be nil
Swift is eltér a célkitűzés-C a használat és ösztönzése érték típusok helyett referencia típusok . A Swift szabványos könyvtárban a legtöbb típus értéktípus, és érték szerint másolódnak, míg az osztályok és a bezárások referencia típusok, és referenciával kerülnek átadásra. Mivel az értéktípusok átmásolásra kerülnek, amikor azokat átadják, automatikusan elosztják őket az őket létrehozó hivatkozással.
Lásd még
Irodalom
Külső linkek
- Áttérés az ARC - iOS fejlesztői könyvtárba
- " Automatikus referenciaszámlálás " a Swift programozási nyelven