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

Finne minnelekkasjer med Instruments

Bruk Xcode Instruments til å identifisere og løse minnelekkasjer, retain-sykluser og andre minnerelaterte ytelsesflaskehalser.

Leksjon 1 av 411 trinn

Finne minnelekkasjer med Instruments er en gratis leksjon i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit. Dette er leksjon 1 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.

Hva er minnelekkasjer

I Objective-C oppstår en minnelekkasje når appen allokerer minne for et objekt, men deretter mister alle referanser til objektet uten å frigjøre det.

Det betyr at minnet fortsatt er opptatt, men appen kan ikke lenger få tilgang til det eller frigjøre det. Over tid kan lekkasjer gjøre appen tregere og til og med føre til at den krasjer.

Introduksjon til Xcode Instruments

Xcode Instruments er et kraftig verktøy for profilering og analyse fra Apple. Det hjelper utviklere med å forstå appenes ytelse på flere områder, blant annet CPU-bruk, energiforbruk og, ikke minst, minnehåndtering.

Det er som røntgensyn for det som skjer inne i appen!

Instrumentet «Leaks»

Blant de mange malene sine tilbyr Instruments instrumentet «Leaks». Dette verktøyet er spesielt utviklet for å oppdage og visualisere minnelekkasjer i Objective-C-applikasjoner.

Det overvåker minneallokeringer og frigjøringer, og fremhever objekter som fortsatt ligger i minnet, men som ikke lenger kan nås.

Profilere appen for å finne lekkasjer

Følg disse trinnene for å begynne å oppdage lekkasjer:

  • 1. Gå til Product > Profile i Xcode.
  • 2. Xcode starter Instruments. Velg malen «Leaks».
  • 3. Klikk på knappen «Choose».
  • 4. Klikk på knappen «Record» (rød sirkel) i Instruments for å starte appen.

Bruk nå appen for å forsøke å utløse mulige lekkasjer.

Tolke Leaks-grafen

Mens appen kjører, viser Instruments en tidslinjegraf. Se etter røde stolper i sporet «Leaks» – disse viser at det er oppdaget en minnelekkasje på det aktuelle tidspunktet.

Stolpens høyde samsvarer ofte med mengden lekket minne eller antallet lekkede objekter.

Finne kilden til lekkasjen

Slik finner De ut hvor en lekkasje oppstår:

  • 1. Velg en rød stolpe (lekkasjetopp) i tidslinjen.
  • 2. Bytt til visningen «Call Tree» i detaljruten nedenfor.
  • 3. Se etter metodekall som er uthevet i rødt eller lilla. Disse peker ofte på koden som er ansvarlig for å allokere det lekkede objektet.

Call stack-sporet hjelper Dem med å finne tilbake til den nøyaktige kodelinjen!

Vanlig årsak: retain-sykluser

En svært vanlig årsak til minnelekkasjer i Objective-C (særlig med ARC) er en retain-syklus (også kalt en syklus med sterke referanser).

Dette oppstår når to eller flere objekter har sterke referanser til hverandre og danner en lukket løkke. Fordi hvert objekt tror at et annet objekt fortsatt trenger det, kan ingen av dem frigjøres, selv om resten av applikasjonen ikke lenger trenger dem.

Eksempel: En retain-syklus

Her er et forenklet eksempel på to klasser, MyObject og OtherObject, som oppretter en retain-syklus. Legg merke til at begge egenskapene er strong.

Kjør denne koden. De vil se meldinger om «initialized», men ingen meldinger om «deallocated», noe som viser at det har oppstått en lekkasje.

// MyObject.h
#import <Foundation/Foundation.h>
@class OtherObject;

@interface MyObject : NSObject
@property (strong, nonatomic) OtherObject *other; // Strong reference
- (instancetype)initWithName:(NSString *)name;
@end

// OtherObject.h
#import <Foundation/Foundation.h>
@class MyObject;

@interface OtherObject : NSObject
@property (strong, nonatomic) MyObject *my; // Strong reference
- (instancetype)initWithName:(NSString *)name;
@end

// MyObject.m
#import "MyObject.h"
#import "OtherObject.h"

@interface MyObject ()
@property (strong, nonatomic) NSString *name;
@end

@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        NSLog(@"MyObject %@ initialized", _name);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"MyObject %@ deallocated", self.name);
}
@end

// OtherObject.m
#import "OtherObject.h"
#import "MyObject.h"

@interface OtherObject ()
@property (strong, nonatomic) NSString *name;
@end

@implementation OtherObject
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        NSLog(@"OtherObject %@ initialized", _name);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"OtherObject %@ deallocated", self.name);
}
@end

// main.m
#import <Foundation/Foundation.h>
#import "MyObject.h"
#import "OtherObject.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"--- Starting Retain Cycle Demo ---");

        MyObject *obj1 = [[MyObject alloc] initWithName:@"Object 1"];
        OtherObject *obj2 = [[OtherObject alloc] initWithName:@"Object 2"];

        // Create a strong, circular reference
        obj1.other = obj2;
        obj2.my = obj1;

        NSLog(@"Objects created and linked. Notice no dealloc messages will appear.");
    }
    NSLog(@"--- Retain Cycle Demo Ended ---");
    return 0;
}

Bryte retain-sykluser med «weak»

For å bryte en retain-syklus må én av referansene i løkken være «weak» i stedet for «strong». En weak-referanse øker ikke et objekts retain-antall, slik at objektet kan frigis når det ikke finnes flere strong-referanser.

Kjør dette korrigerte eksempelet. Nå vil De se meldingene «deallocated», noe som betyr at det ikke finnes noen lekkasje!

// MyObject.h
#import <Foundation/Foundation.h>
@class OtherObject;

@interface MyObject : NSObject
@property (strong, nonatomic) OtherObject *other;
- (instancetype)initWithName:(NSString *)name;
@end

// OtherObject.h (FIXED: Using 'weak')
#import <Foundation/Foundation.h>
@class MyObject;

@interface OtherObject : NSObject
@property (weak, nonatomic) MyObject *my; // Weak reference to break the cycle
- (instancetype)initWithName:(NSString *)name;
@end

// MyObject.m
#import "MyObject.h"
#import "OtherObject.h"

@interface MyObject ()
@property (strong, nonatomic) NSString *name;
@end

@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        NSLog(@"MyObject %@ initialized", _name);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"MyObject %@ deallocated", self.name);
}
@end

// OtherObject.m
#import "OtherObject.h"
#import "MyObject.h"

@interface OtherObject ()
@property (strong, nonatomic) NSString *name;
@end

@implementation OtherObject
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        NSLog(@"OtherObject %@ initialized", _name);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"OtherObject %@ deallocated", self.name);
}
@end

// main.m
#import <Foundation/Foundation.h>
#import "MyObject.h"
#import "OtherObject.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"--- Starting Fixed Cycle Demo ---");

        MyObject *obj1 = [[MyObject alloc] initWithName:@"Object 1"];
        OtherObject *obj2 = [[OtherObject alloc] initWithName:@"Object 2"];

        // Assign references. obj2 now has a weak ref to obj1.
        obj1.other = obj2;
        obj2.my = obj1;

        NSLog(@"Objects created and linked. Now dealloc messages should appear!");
    }
    NSLog(@"--- Fixed Cycle Demo Ended ---");
    return 0;
}

Kort sjekk: Oppdage lekkasjer

De har lagt merke til at Objective-C-appen Deres blir tregere over tid og bruker mer minne enn forventet. De mistenker minnelekkasjer.

Oppsummering: Få kontroll på minnet

De har lært at minnelekkasjer hindrer objekter i å bli frigitt, noe som fører til ytelsesproblemer. Xcode Instruments, særlig malen «Leaks», er verktøyet De bør bruke for å identifisere disse problemene.

En vanlig årsak er en retain-syklus, der objekter har sterke referanser til hverandre. De kan bryte disse syklusene ved å bruke weak-referanser (@property (weak, nonatomic)) for å sikre korrekt minnehåndtering.

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 «Finne minnelekkasjer med Instruments» gratis?

Ja – hele teksten i «Finne minnelekkasjer med Instruments» 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 «Finne minnelekkasjer med Instruments»?

Bruk Xcode Instruments til å identifisere og løse minnelekkasjer, retain-sykluser og andre minnerelaterte ytelsesflaskehalser. 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 1 av 4.

Hvor lang tid tar leksjonen «Finne minnelekkasjer med Instruments»?

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. Finne minnelekkasjer med Instruments
  2. Optimalisering av UI-gjengivelse og respons
  3. Avanserte feilsøkingsteknikker
  4. Profilering og redusert oppstartstid for apper
← Tilbake til Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper