Objective-C iOS-kehitys vanhoille ja yrityssovelluksille · Oppitunti

Muistivuotojen tunnistaminen Instrumentsilla

Hyödynnätte Xcode Instrumentsia muistivuotojen, retain-syklien ja muiden muistiin liittyvien suorituskyvyn pullonkaulojen tunnistamiseen ja ratkaisemiseen.

Oppitunti 1/411 vaihetta

Muistivuotojen tunnistaminen Instrumentsilla on ilmainen Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssilla on yhteensä 4 oppituntia.

Mitä muistivuodot ovat

Objective-C:ssä muistivuoto syntyy, kun sovellus varaa objektille muistia mutta menettää sitten kaikki viittaukset objektiin vapauttamatta sitä.

Tällöin muisti on edelleen varattu, mutta sovellus ei enää voi käyttää tai vapauttaa sitä. Ajan mittaan muistivuodot voivat hidastaa sovellusta ja jopa aiheuttaa sen kaatumisen.

Xcode Instrumentsin esittely

Xcode Instruments on Applen tarjoama tehokas profilointi- ja analysointityökalu. Se auttaa kehittäjiä ymmärtämään sovellustensa toimintaa eri osa-alueilla, kuten suorittimen käytössä, energiankulutuksessa ja erityisesti muistinhallinnassa.

Se on kuin sovelluksen sisäosien röntgennäkö!

Leaks-instrumentti

Monien mallipohjiensa joukossa Instruments tarjoaa erillisen ”Leaks”-instrumentin. Tämä työkalu on suunniteltu erityisesti Objective-C-sovellusten muistivuotojen havaitsemiseen ja visualisointiin.

Se seuraa muistin varauksia ja vapautuksia ja korostaa objekteja, jotka ovat edelleen muistissa mutta joihin ei enää pääse käsiksi.

Sovelluksen profilointi muistivuotojen löytämiseksi

Aloita muistivuotojen havaitseminen seuraavasti:

  • 1. Valitse Xcodessa Product > Profile.
  • 2. Xcode käynnistää Instrumentsin. Valitse ”Leaks”-mallipohja.
  • 3. Napsauta ”Choose”-painiketta.
  • 4. Aloita sovelluksen suorittaminen napsauttamalla Instrumentsissa ”Record”-painiketta (punainen ympyrä).

Käytä nyt sovellusta ja yritä laukaista mahdollisia muistivuotoja.

Leaks-kaavion tulkitseminen

Sovelluksen suorittuessa Instruments näyttää aikajanakaavion. Etsi ”Leaks”-raidalle ilmestyviä punaisia palkkeja – ne osoittavat, että kyseisenä ajankohtana on havaittu muistivuoto.

Palkin korkeus vastaa usein vuotaneen muistin määrää tai vuotaneiden objektien lukumäärää.

Muistivuodon lähteen paikantaminen

Selvitä, missä muistivuoto tapahtuu, seuraavasti:

  • 1. Valitse aikajanalta punainen palkki (vuotopiikki).
  • 2. Vaihda alla olevassa tietoruudussa ”Call Tree” -näkymään.
  • 3. Etsi punaisella tai violetilla korostettuja menetelmäkutsuja. Ne osoittavat usein koodin, joka vastaa vuotaneen objektin varaamisesta.

Kutsupinon avulla voit jäljittää vuodon tarkalleen oikealle koodiriville!

Yleinen syy: säilytysviittauskehä

Hyvin yleinen muistivuotojen syy Objective-C:ssä (erityisesti ARC:tä käytettäessä) on säilytysviittauskehä (josta käytetään myös nimitystä vahvojen viittausten kehä).

Se syntyy, kun vähintään kaksi objektia pitää toisiinsa vahvoja viittauksia ja muodostaa suljetun kehän. Koska kumpikin objekti olettaa, että toinen tarvitsee sitä edelleen, kumpaakaan ei voida vapauttaa, vaikka muu sovellus ei enää tarvitsisi niitä.

Esimerkki: säilytysviittauskehä

Tässä on yksinkertaistettu esimerkki kahdesta luokasta, MyObject ja OtherObject, jotka muodostavat säilytysviittauskehän. Huomaa, että molemmat ominaisuudet ovat strong.

Suorita tämä koodi. Näet ”initialized”-viestejä, mutta et ”deallocated”-viestejä, mikä osoittaa muistivuodon.

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

Retain-syklien katkaiseminen weak-viittauksilla

Retain-syklin katkaisemiseksi yhden silmukan viittauksista on oltava weak strong-viittauksen sijaan. Heikko viittaus ei kasvata olion retain-laskuria, joten olio voidaan vapauttaa, kun vahvoja viittauksia ei enää ole.

Suorittakaa tämä korjattu esimerkki. Näette nyt deallocated-viestit, mikä tarkoittaa, ettei muistivuotoa ole!

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

Pikatarkistus: muistivuotojen havaitseminen

Olette huomanneet, että Objective-C-sovelluksenne hidastuu ajan myötä ja käyttää odotettua enemmän muistia. Epäilette muistivuotoja.

Kertaus: muistinhallinnan hallitseminen

Olette oppineet, että muistivuodot estävät olioiden vapauttamisen, mikä aiheuttaa suorituskykyongelmia. Xcode Instruments ja erityisesti Leaks-malli ovat ensisijaisia työkalujanne näiden ongelmien tunnistamiseen.

Yleinen syyllinen on retain-sykli, jossa oliot viittaavat vahvasti toisiinsa. Voitte katkaista nämä syklit käyttämällä heikkoja viittauksia (@property (weak, nonatomic)), mikä varmistaa asianmukaisen muistinhallinnan.

Aloita maksutta

Opi Objective-C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Muistivuotojen tunnistaminen Instrumentsilla” ilmainen?

Kyllä – oppitunnin ”Muistivuotojen tunnistaminen Instrumentsilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssin, päivitä CoddyKit PROhon. Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Muistivuotojen tunnistaminen Instrumentsilla”?

Hyödynnätte Xcode Instrumentsia muistivuotojen, retain-syklien ja muiden muistiin liittyvien suorituskyvyn pullonkaulojen tunnistamiseen ja ratkaisemiseen. Harjoittelet Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Muistivuotojen tunnistaminen Instrumentsilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunnilla?

Kyllä. Jokainen Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Muistivuotojen tunnistaminen Instrumentsilla
  2. Käyttöliittymän piirtämisen ja responsiivisuuden optimointi
  3. Edistyneet virheenkorjaustekniikat
  4. Sovelluksen käynnistysajan profilointi ja lyhentäminen
← Takaisin: Objective-C iOS-kehitys vanhoille ja yrityssovelluksille