Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer · Lektion

Automatisk referenceoptælling (ARC)

Udforsk, hvordan ARC forenkler hukommelseshåndtering, og hvilke konsekvenser det har for Objective-C-udvikling og ældre kode.

Lektion 2 af 411 trin

Automatisk referenceoptælling (ARC) er en gratis Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Velkommen til ARC

Hukommelseshåndtering er afgørende i programmering. I Objective-C skulle du tidligere håndtere hukommelsen manuelt, hvilket kunne føre til fejl som hukommelseslækager eller nedbrud.

Automatic Reference Counting (ARC) ændrede dette ved at automatisere en stor del af arbejdet for dig. Det er en funktion i compileren, ikke en garbage collector i runtime-miljøet.

ARC: Compilerens magi

Med ARC indsætter Xcode-compileren automatisk den nødvendige kode til hukommelseshåndtering, f.eks. kald til retain, release og autorelease, i din app under kompileringen.

Det betyder, at du ikke længere selv skal skrive disse kald. Compileren sørger for, at objekter holdes i live, så længe der er brug for dem, og frigives, når der ikke længere er brug for dem.

Dit første ARC-objekt

Lad os se ARC i praksis. Når du opretter et Objective-C-objekt, håndterer ARC automatisk dets hukommelse. Du behøver ikke kalde release.

Dette enkle eksempel viser, hvordan en NSString oprettes. ARC håndterer frigivelsen, når der ikke længere er nogen referencer til objektet.

#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;
}

Egenskaber og stærke referencer

Når du erklærer egenskaber til dine objekter, bruger ARC som standard stærke referencer til Objective-C-objekter. En stærk reference betyder, at objektet er "ejet" og ikke bliver frigivet, så længe der er mindst én stærk reference til det.

For primitive typer som int og float skal du bruge 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;
}

Tilpasset oprydning med `dealloc`

Med ARC skal du ikke kalde [super dealloc] eller frigive objekter med release i din dealloc-metode. Compileren håndterer frigivelsen af alle Objective-C-objekter.

Du bruger stadig dealloc til at rydde op i ressourcer, der ikke er Objective-C, f.eks. Core Foundation-objekter, C++-objekter eller filhåndtag.

#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 til ældre projekter

Mange ældre Objective-C-projekter blev skrevet med Manual Retain-Release (MRR). Xcode indeholder et værktøj, der kan hjælpe med at migrere disse projekter til ARC.

Gå til Edit > Refactor > Convert to Objective-C ARC.... Det automatiserer en stor del af konverteringen, men der kan stadig være behov for manuelle ændringer, især i komplekse projekter eller kodebaser med blandet kode.

Kodebaser med blandet kode

Nogle gange kan du få brug for at bruge filer uden ARC i et ARC-projekt, f.eks. biblioteker fra tredjeparter. Det tillader Xcode.

Du kan få compileren til at kompilere bestemte filer uden ARC ved at angive compilerflaget -fno-objc-arc for disse filer under projektets indstillinger for Build Phases.

ARC og Core Foundation

ARC håndterer kun Objective-C-objekter. Det håndterer ikke Core Foundation-objekter som CFStringRef og CFArrayRef, der er C-baserede.

Hvis du vil konvertere mellem Objective-C-typer og Core Foundation-typer, bruger du bro-casts: __bridge, __bridge_transfer og __bridge_retained. De fortæller ARC, hvordan ejerskab 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 begrænsninger og faldgruber

Selvom ARC forenkler hukommelseshåndteringen, løser det ikke alle problemer. Det kan ikke forhindre bevaringscyklusser, hvor to objekter har stærke referencer til hinanden, så ingen af dem bliver frigivet.

Her kommer svage referencer ind i billedet, og dem gennemgår vi i næste lektion. Vær også opmærksom på C-baseret hukommelse (malloc/free), som ARC ikke håndterer.

Kontrol af din ARC-viden

ARC ændrede markant den måde, vi håndterer hukommelse på i Objective-C.

Hvilken af følgende er den primære fordel ved at bruge Automatic Reference Counting (ARC) i Objective-C-udvikling?

Opsummering af ARC og det næste trin

Du har lært, at ARC automatiserer hukommelseshåndteringen ved at indsætte kald til retain og release under kompileringen. Det forenkler udviklingen betydeligt og reducerer almindelige hukommelsesfejl.

Vi har også berørt håndteringen af Core Foundation-objekter og vigtigheden af at bruge dealloc til oprydning i ressourcer, der ikke er Objective-C.

Som det næste ser vi nærmere på svage og stærke referencer for at forstå, hvordan du kan forhindre bevaringscyklusser, som er et vigtigt begreb, også når du bruger ARC.

Gratis at komme i gang

Lær Objective-C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Automatisk referenceoptælling (ARC)” gratis?

Ja — hele teksten til “Automatisk referenceoptælling (ARC)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset, skal du opgradere til CoddyKit PRO. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Automatisk referenceoptælling (ARC)”?

Udforsk, hvordan ARC forenkler hukommelseshåndtering, og hvilke konsekvenser det har for Objective-C-udvikling og ældre kode. Du øver dig i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer?

Der kræves ingen tidligere erfaring. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Automatisk referenceoptælling (ARC)”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion?

Ja. Alle Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende manuel retain-release (MRR)
  2. Automatisk referenceoptælling (ARC)
  3. Svage og stærke referencer
  4. Sådan bryder du retain-cyklusser i blocks
← Tilbage til Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer