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
- 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
.
- 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.
Curs de Programació en Objective-C
Mòdul 1: Introducció a Objective-C
- Introducció a Objective-C
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Tipus de Dades i Variables
- Operadors i Expressions
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Mètodes
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Sintaxi de Mètodes en Objective-C
- Mètodes de Classe i d'Instància
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Gestió de Memòria
- Introducció a la Gestió de Memòria
- Comptatge Automàtic de Referències (ARC)
- Retenció i Alliberament Manual
- Millors Pràctiques de Gestió de Memòria
Mòdul 6: Temes Avançats
Mòdul 7: Treballant amb Dades
- Gestió d'Arxius
- Serialització i Deserialització
- Conceptes Bàsics de Xarxes
- Treballant amb JSON i XML
Mòdul 8: Desenvolupament d'Interfícies d'Usuari
- Introducció a UIKit
- Vistes i Controladors de Vista
- Disseny Automàtic
- Gestió de l'Entrada de l'Usuari