Automatisk referansetelling (ARC)
Utforsk hvordan ARC forenkler minnehåndtering, og hvilke følger det har for Objective-C-utvikling og eldre kode.
Automatisk referansetelling (ARC) er en gratis leksjon i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.
Velkommen til ARC
Minnehåndtering er avgjørende i programmering. I Objective-C måtte du tidligere håndtere minnet manuelt, noe som kunne føre til feil som minnelekkasjer eller krasj.
Automatic Reference Counting (ARC) endret dette ved å automatisere mye av arbeidet for deg. Det er en kompilatorfunksjon, ikke en garbage collector i runtime-miljøet.
ARC: Kompilatormagi
Med ARC legger Xcode-kompilatoren automatisk inn den nødvendige minnehåndteringskoden, for eksempel retain-, release- og autorelease-kall, i appen under kompileringen.
Det betyr at du ikke lenger skriver disse kallene selv. Kompilatoren sørger for at objekter holdes i live så lenge de trengs, og frigis når de ikke lenger trengs.
Ditt første ARC-objekt
La oss se ARC i praksis. Når du oppretter et Objective-C-objekt, håndterer ARC minnet automatisk. Du trenger ikke å kalle release.
Dette enkle eksempelet viser hvordan en NSString opprettes. ARC håndterer deallokeringen når det ikke lenger finnes noen referanser til den.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Create an NSString object
NSString *greeting = @"Hello, CoddyKit!";
NSLog(@"%@", greeting);
// ARC automatically manages the memory for 'greeting'.
// No explicit [greeting release] is needed here.
}
return 0;
}Egenskaper og sterke referanser
Når du deklarerer egenskaper for objektene dine, bruker ARC som standard strong-referanser for Objective-C-objekter. En strong-referanse betyr at objektet er «eid» og ikke blir deallokert så lenge det finnes minst én strong-referanse til det.
For primitive typer, som int og float, bruker du assign.
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@property (strong, nonatomic) NSString *name;
- (void)sayHello;
@end
@implementation MyObject
- (void)sayHello {
NSLog(@"Hello, my name is %@", self.name);
}
// dealloc is called automatically when strong refs are gone
- (void)dealloc {
NSLog(@"MyObject %@ is deallocated.", self.name);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init];
obj.name = @"Coddy"; // 'name' is a strong property
[obj sayHello];
// 'obj' goes out of scope, ARC releases it, dealloc is called.
}
return 0;
}Egendefinert opprydding med `dealloc`
Med ARC skal du ikke kalle [super dealloc] eller frigi objekter med release i dealloc-metoden. Kompilatoren håndterer all frigjøring av Objective-C-objekter.
Du bruker fortsatt dealloc til å rydde opp i ressurser som ikke er Objective-C-ressurser, for eksempel Core Foundation-objekter, C++-objekter eller filhåndtak.
#import <Foundation/Foundation.h>
@interface MyResourceHolder : NSObject
@property (strong, nonatomic) NSString *identifier;
@end
@implementation MyResourceHolder
- (instancetype)init {
self = [super init];
if (self) {
_identifier = @"My Unique ID";
NSLog(@"MyResourceHolder %@ created.", _identifier);
// Imagine opening a C file handle or allocating C memory here.
}
return self;
}
// ARC handles Objective-C objects. Use dealloc for other resources.
- (void)dealloc {
NSLog(@"MyResourceHolder %@ deallocated. (Closing C file handle, etc.)", _identifier);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyResourceHolder *holder = [[MyResourceHolder alloc] init];
// holder goes out of scope, ARC deallocates it.
}
return 0;
}Overgang fra eldre prosjekter
Mange eldre Objective-C-prosjekter ble skrevet med Manual Retain-Release (MRR). Xcode tilbyr et verktøy som hjelper deg med å migrere disse prosjektene til ARC.
Gå til Edit > Refactor > Convert to Objective-C ARC.... Dette automatiserer mye av konverteringen, men det kan fortsatt være nødvendig med manuelle justeringer, særlig i komplekse prosjekter eller kodebaser med blandet kode.
Blandede kodebaser
Noen ganger kan det være nødvendig å bruke filer uten ARC i et ARC-prosjekt, for eksempel tredjepartsbiblioteker. Xcode tillater dette.
Du kan be kompilatoren kompilere bestemte filer uten ARC ved å angi kompilatorflagget -fno-objc-arc for disse filene i prosjektets Build Phases-innstillinger.
ARC og Core Foundation
ARC håndterer bare Objective-C-objekter. Det håndterer ikke Core Foundation-objekter, som CFStringRef og CFArrayRef, fordi disse er C-baserte.
For å konvertere mellom Objective-C- og Core Foundation-typer bruker du bridging casts: __bridge, __bridge_transfer og __bridge_retained. Disse angir for ARC hvordan eierskapet skal håndteres.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *ocString = @"Hello ARC!";
// __bridge_retained: transfer ownership from ARC to Core Foundation.
// CFRelease must be called manually later.
CFStringRef cfString = (__bridge_retained CFStringRef)ocString;
NSLog(@"Objective-C String: %@", ocString);
NSLog(@"Core Foundation String: %@", (__bridge NSString *)cfString);
// Manual release required for Core Foundation objects obtained via __bridge_retained
CFRelease(cfString);
}
return 0;
}ARCs begrensninger og fallgruver
Selv om ARC forenkler minnehåndteringen, løser det ikke alle problemer. Det kan ikke forhindre retain-sykluser, der to objekter har sterke referanser til hverandre og dermed hindrer hverandre i å bli deallokert.
Det er her svake referanser kommer inn, noe vi skal ta for oss i neste leksjon. Vær også oppmerksom på C-styrt minne, som malloc/free, fordi ARC ikke håndterer dette.
Kontroll av ARC-kunnskap
ARC endret betydelig hvordan vi håndterer minne i Objective-C.
Hvilket av følgende er den viktigste fordelen ved å bruke Automatic Reference Counting (ARC) i Objective-C-utvikling?
Oppsummering av ARC og veien videre
Du har lært at ARC automatiserer minnehåndteringen ved å sette inn retain- og release-kall under kompileringen. Dette forenkler utviklingen betydelig og reduserer vanlige minnefeil.
Vi har også vært innom håndtering av Core Foundation-objekter og viktigheten av å bruke dealloc til å rydde opp i ressurser som ikke er Objective-C-ressurser.
Deretter skal vi gå nærmere inn på svake kontra sterke referanser for å forstå hvordan retain-sykluser kan forhindres, et viktig konsept også når du bruker ARC.
Lær deg Objective-C med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Automatisk referansetelling (ARC)» gratis?
Ja – hele teksten i «Automatisk referansetelling (ARC)» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.
Hva lærer jeg i «Automatisk referansetelling (ARC)»?
Utforsk hvordan ARC forenkler minnehåndtering, og hvilke følger det har for Objective-C-utvikling og eldre kode. Du øver på Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper?
Ingen tidligere erfaring er nødvendig. Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Automatisk referansetelling (ARC)»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjonen?
Ja. Alle Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grunnleggende om manuell retain-release (MRR)
- Automatisk referansetelling (ARC)
- Svake kontra sterke referanser
- Bryte retain-sykluser i blokker