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.
Text of CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
1. CocoaHeads Rennes #9 Thomas Dupont 12 avril 2012 Gestion Mmoire du dbutant lexpert
2. Sommaire Gestion mmoire Compteur de rfrences Properties Blocks ARC
3. Gestion mmoire 7 6 5 4 sp co if (b) { 3 int y = 3; 2 } 1 0 stack
4. Gestion mmoire 7 6 adresse de retour : 4 sp 5 variable y 4 co if (b) { 3 int y = 3; 2 } 1 0 stack
5. Gestion mmoire malloc free heap
6. Compteur de rfrences NSObject retain release 2 1 0
7. Compteur de rfrences Vous tes responsable des objets que vous crez Vous pouvez devenir responsable dun objet avec retain Vous devez relcher un objet dont vous tes responsable Cmtaphore du chien 2 1 0 3 chien A B
8. Compteur de rfrences + (MyObject*)fetchMyObject; MyObject* obj = [MyObject fetchMyObject];+ (id)alloc- (id)init+ (id)new Conventions de nommage- (id)copy- (id)mutableCopy
19. ARC@implementation Stack { NSMutableArray *array; }- (id) init { if (self = [super init]) array = [NSMutableArray array] ; return self;}- (void) push: (id) x { [array addObject: x];}- (id) pop { id x = [array lastObject] ; [ [array removeLastObject]; return [ ;}@end
20. ARC@implementation Stack { NSMutableArray *array; }- (id) init { if (self = [super init]) array = [ [NSMutableArray array] retain] ; return self;}- (void) push: (id) x { [array addObject: x];}- (id) pop { id x = [ [array lastObject] retain] ; [array removeLastObject]; return [ x autorelease] ;}- (void) dealloc { [array release]; [super dealloc]; }@end
21. ARC It just works ! Insertion automatique de retain, release et autorelease Oublier la notion de retain et release Penser au graphe dobjets
22. ARC __strong valeur par dfaut 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 ds que lobjet est dtruit- (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