Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper · leksjon

Automatisk referansetelling (ARC)

Utforsk hvordan ARC forenkler minnehåndtering, og hvilke følger det har for Objective-C-utvikling og eldre kode.

Leksjon 2 av 411 trinn

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.

Gratis å komme i gang

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

  1. Grunnleggende om manuell retain-release (MRR)
  2. Automatisk referansetelling (ARC)
  3. Svake kontra sterke referanser
  4. Bryte retain-sykluser i blokker
← Tilbake til Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper