La session rennaise des CocoaHeads du mois d'avril 2012 fût l'occasion de revenir sur un des grands sujets d'iOS: la gestion mémoire. Thomas Dupont nous a présenté le sujet en partant des considérations les plus simples en allant vers les cas les plus complexes. Sa présentation est assurément un bon moyen pour se lancer dans le sujet, pour faire un rappel des basiques ou pour aller plus loin ... Une large partie de sa présentation était consacrée à ARC.
7. Compteur de références
‣ Vous êtes responsable des objets que vous créez
‣ Vous pouvez devenir responsable d’un objet avec retain
‣ Vous devez relâcher un objet dont vous êtes responsable
C
métaphore du chien
2
1
0
3
chien
A B
21. ARC
It just works !
Insertion automatique de retain, release et autorelease
Oublier la notion de retain et release
Penser au graphe d’objets
22. ARC
__strong
valeur par défaut
devient responsable
- (id) pop {
__strong id result = objc_retain ( [array lastObject] ) ;
[array removeLastObject] ;
return objc_autorelease ( result )
;
}
23. ARC
__unsafe_unretained
ne devient pas responsable
utilisé pour éviter les deadlocks
- (void) dealloc {
[myTableView setDelegate:nil];
[myTableView setDataSource:nil];
}
24. ARC
__weak
ne devient pas responsable
utilisé pour éviter les deadlocks
remis à nil dès que l’objet est détruit
- (void) testWeak {
id newObject = [NSObject new];
__weak id value = newObject;
newObject = nil;
assert(value == nil);
} ! disponible que depuis iOS 5.0 et OS X 10.7
25. ARC
@property (strong) id x; // __strong , a.k.a retain
@property (unsafe_unretained) id y; // __unsafe_unretained , a.k.a assign
@property (weak) id z; // __weak