El Comptatge Automàtic de Referències (ARC) és una característica de gestió de memòria introduïda per Apple per simplificar la gestió de la memòria en Objective-C. ARC automatitza el procés de retenció i alliberament d'objectes, reduint la càrrega del programador i minimitzant els errors de memòria com les fuites i els accessos a memòria alliberada.

Conceptes Clau

  1. Referències Fortes i Febles

  • Referències Fortes: Una referència forta manté l'objecte viu. Quan un objecte té almenys una referència forta, no serà alliberat de la memòria.
  • Referències Febles: Una referència feble no manté l'objecte viu. Si totes les referències fortes a un objecte es destrueixen, l'objecte serà alliberat, i les referències febles es posaran automàticament a nil.

  1. Cicle de Vida d'un Objecte

  • Creació: Quan es crea un objecte, ARC assigna memòria per a aquest objecte.
  • Retenció: Quan una referència forta apunta a un objecte, el comptador de referències de l'objecte s'incrementa.
  • Alliberament: Quan una referència forta deixa d'apuntar a un objecte, el comptador de referències de l'objecte es decrementa.
  • Destrucció: Quan el comptador de referències arriba a zero, ARC allibera la memòria de l'objecte.

Exemples Pràctics

Exemple 1: Referències Fortes

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        person.name = @"John Doe";
        NSLog(@"Person's name: %@", person.name);
    }
    // Aquí, l'objecte 'person' es destrueix automàticament quan surt del bloc @autoreleasepool
    return 0;
}

Exemple 2: Referències Febles

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@end

@interface Company : NSObject
@property (nonatomic, weak) Person *employee;
@end

@implementation Company
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        person.name = @"John Doe";
        
        Company *company = [[Company alloc] init];
        company.employee = person;
        
        NSLog(@"Employee's name: %@", company.employee.name);
    }
    // Aquí, l'objecte 'person' es destrueix automàticament quan surt del bloc @autoreleasepool
    // i la referència feble 'employee' es posa a nil.
    return 0;
}

Exercicis Pràctics

Exercici 1: Creació i Alliberament d'Objectes

Descripció: Crea una classe Car amb una propietat model de tipus NSString. Crea una instància de Car dins d'un bloc @autoreleasepool i assigna un valor a la propietat model. Imprimeix el valor de model i observa com ARC gestiona la memòria.

Solució:

#import <Foundation/Foundation.h>

@interface Car : NSObject
@property (nonatomic, strong) NSString *model;
@end

@implementation Car
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *car = [[Car alloc] init];
        car.model = @"Tesla Model S";
        NSLog(@"Car model: %@", car.model);
    }
    // Aquí, l'objecte 'car' es destrueix automàticament quan surt del bloc @autoreleasepool
    return 0;
}

Exercici 2: Referències Febles

Descripció: Crea una classe Owner amb una propietat car de tipus Car (de l'exercici anterior) com a referència feble. Crea instàncies de Owner i Car dins d'un bloc @autoreleasepool i assigna la instància de Car a la propietat car de Owner. Imprimeix el valor de model de car i observa com ARC gestiona la memòria.

Solució:

#import <Foundation/Foundation.h>

@interface Car : NSObject
@property (nonatomic, strong) NSString *model;
@end

@implementation Car
@end

@interface Owner : NSObject
@property (nonatomic, weak) Car *car;
@end

@implementation Owner
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *car = [[Car alloc] init];
        car.model = @"Tesla Model S";
        
        Owner *owner = [[Owner alloc] init];
        owner.car = car;
        
        NSLog(@"Owner's car model: %@", owner.car.model);
    }
    // Aquí, l'objecte 'car' es destrueix automàticament quan surt del bloc @autoreleasepool
    // i la referència feble 'car' es posa a nil.
    return 0;
}

Resum

En aquesta secció, hem après sobre el Comptatge Automàtic de Referències (ARC) en Objective-C, incloent-hi els conceptes de referències fortes i febles, i com ARC gestiona automàticament la memòria dels objectes. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. Amb ARC, la gestió de memòria es simplifica significativament, permetent als desenvolupadors centrar-se més en la lògica de l'aplicació i menys en la gestió manual de la memòria.

© Copyright 2024. Tots els drets reservats