Objective-C iOS-kehitys vanhoille ja yrityssovelluksille · Oppitunti

Automaattinen viitelaskenta (ARC)

Tutustukaa siihen, miten ARC yksinkertaistaa muistinhallintaa ja mitä vaikutuksia sillä on Objective-C-kehitykseen ja vanhaan koodiin.

Oppitunti 2/411 vaihetta

Automaattinen viitelaskenta (ARC) on ilmainen Objective-C iOS-kehitys vanhoille ja yrityssovelluksille-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.

Tervetuloa ARC:n pariin

Muistinhallinta on ohjelmoinnissa ratkaisevan tärkeää. Objective-C:ssä muistia piti aiemmin hallita manuaalisesti, mikä saattoi johtaa esimerkiksi muistivuotoihin tai kaatumisiin.

Automatic Reference Counting (ARC) muutti tilanteen automatisoimalla suuren osan tästä työstä. Se on kääntäjän ominaisuus, ei ajonaikainen roskienkerääjä.

ARC: kääntäjän taikuutta

ARC:n kanssa Xcode-kääntäjä lisää tarvittavan muistinhallintakoodin, kuten retain-, release- ja autorelease-kutsut, sovellukseen käännöksen aikana.

Tämä tarkoittaa, ettei näitä kutsuja tarvitse enää kirjoittaa itse. Kääntäjä varmistaa, että oliot säilyvät niin kauan kuin niitä tarvitaan ja vapautetaan, kun niitä ei enää tarvita.

Ensimmäinen ARC-olionne

Katsotaan ARC:n toimintaa käytännössä. Kun luotte Objective-C-olion, ARC hallitsee sen muistia automaattisesti. release-kutsua ei tarvitse tehdä.

Tässä yksinkertaisessa esimerkissä luodaan NSString. ARC huolehtii sen vapauttamisesta, kun siihen ei enää viitata.

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

Ominaisuudet ja vahvat viitteet

Kun määrittelette olioillenne ominaisuuksia, ARC käyttää Objective-C-olioille oletusarvoisesti vahvoja viitteitä. Vahva viite tarkoittaa, että olio on "omistettu" eikä sitä vapauteta niin kauan kuin siihen on vähintään yksi vahva viite.

Alkeistyypeille, kuten int ja float, käytätte assign-määrettä.

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

Mukautettu siivous `dealloc`-metodilla

ARC:n kanssa ette kutsu [super dealloc]-kutsua ettekä vapauta olioita dealloc-metodissanne. Kääntäjä huolehtii kaikkien Objective-C-olioiden vapauttamisesta.

Käytätte silti dealloc-metodia muiden kuin Objective-C-resurssien, kuten Core Foundation -olioiden, C++-olioiden tai tiedostokahvojen, siivoamiseen.

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

Vanhojen projektien siirtäminen

Monet vanhemmat Objective-C-projektit on kirjoitettu Manual Retain-Releasella (MRR). Xcode tarjoaa työkalun, jolla nämä projektit voi siirtää ARC:n käyttöön.

Valitkaa Edit > Refactor > Convert to Objective-C ARC.... Tämä automatisoi suuren osan muunnoksesta, mutta manuaalisia muutoksia saatetaan silti tarvita erityisesti monimutkaisissa projekteissa tai koodikannoissa, joissa käytetään useita toimintatapoja.

Sekakoodikannat

Joskus ARC-projektissa on käytettävä tiedostoja, joissa ARC ei ole käytössä, esimerkiksi kolmannen osapuolen kirjastoja. Xcode mahdollistaa tämän.

Voitte ohjata kääntäjää kääntämään tietyt tiedostot ilman ARC:tä määrittämällä näille tiedostoille -fno-objc-arc-kääntäjälipun projektin Build Phases -asetuksissa.

ARC ja Core Foundation

ARC hallitsee vain Objective-C-olioita. Se ei hallitse Core Foundation -olioita, kuten CFStringRef ja CFArrayRef, jotka perustuvat C:hen.

Objective-C- ja Core Foundation -tyyppien välillä muuntamiseen käytätte siltauscastauksia: __bridge, __bridge_transfer ja __bridge_retained. Ne kertovat ARC:lle, miten omistajuutta käsitellään.

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

ARC:n rajoitukset ja sudenkuopat

Vaikka ARC yksinkertaistaa muistinhallintaa, se ei ratkaise kaikkia ongelmia. Se ei pysty estämään retain-syklejä, joissa kaksi oliota viittaa vahvasti toisiinsa, jolloin kumpaakaan ei vapauteta.

Tässä tilanteessa heikot viitteet ovat hyödyllisiä. Käsittelemme niitä seuraavassa oppitunnissa. Huomioikaa myös C-tyylinen muisti (malloc/free), jota ARC ei hallitse.

ARC-tietojen testi

ARC muutti merkittävästi tapaa, jolla muistia hallitaan Objective-C:ssä.

Mikä seuraavista on Automatic Reference Countingin (ARC) keskeinen hyöty Objective-C-kehityksessä?

ARC:n kertaus ja seuraavat aiheet

Olette oppineet, että ARC automatisoi muistinhallinnan lisäämällä retain- ja release-kutsut käännöksen aikana. Tämä yksinkertaistaa kehitystä huomattavasti ja vähentää yleisiä muistinhallinnan virheitä.

Tutustuimme myös Core Foundation -olioiden hallintaan sekä siihen, miten tärkeää dealloc-metodia on käyttää muiden kuin Objective-C-resurssien siivoamiseen.

Seuraavaksi perehdymme aiheeseen heikot ja vahvat viitteet ja opimme, miten retain-syklejä voidaan ehkäistä. Tämä on tärkeä käsite myös ARC:n kanssa.

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 ”Automaattinen viitelaskenta (ARC)” ilmainen?

Kyllä – oppitunnin ”Automaattinen viitelaskenta (ARC)” 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 ”Automaattinen viitelaskenta (ARC)”?

Tutustukaa siihen, miten ARC yksinkertaistaa muistinhallintaa ja mitä vaikutuksia sillä on Objective-C-kehitykseen ja vanhaan koodiin. 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 2/4.

Kuinka kauan ”Automaattinen viitelaskenta (ARC)”-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. Manuaalisen retain-release-mallin (MRR) perusteet
  2. Automaattinen viitelaskenta (ARC)
  3. Heikot ja vahvat viitteet
  4. Retain-kiertojen katkaiseminen lohkoissa
← Takaisin: Objective-C iOS-kehitys vanhoille ja yrityssovelluksille