CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert

  • Published on
    22-Apr-2015

  • View
    3.783

  • Download
    2

Embed Size (px)

DESCRIPTION

La session rennaise des CocoaHeads du mois d'avril 2012 ft l'occasion de revenir sur un des grands sujets d'iOS: la gestion mmoire. Thomas Dupont nous a prsent le sujet en partant des considrations les plus simples en allant vers les cas les plus complexes. Sa prsentation est assurment 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 prsentation tait consacre ARC.

Transcript

  • 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
  • 9. Compteur de rfrences autoreleaserun loop autoreleasepool 1 0 obj obj
  • 10. Properties@property (attributes) NSObject* myObj;@synthesize myObj; getter= setter= assign nonatomic retain readonly copy readwrite
  • 11. Blocks dispatch_block_t myBlock = ^{ myView.alpha = 0;} ; [UIView animateWithDuration:0.5 animations: myBlock ];
  • 12. Blocks __block int a = 3; void (^incrementA)(void) = ^{ a++; }; incrementA();
  • 13. Blocks __block NSObject* myObj; void (^foo)(void) = ^{ [myObj foo]; }; foo();
  • 14. BlocksMyClass.h MyObject* myObj; int myIvar;MyClass.m void (^foo)(void) = ^{ myIvar++; [myObj foo]; }; foo();
  • 15. Blocks myObjMyClass.h MyObject* myObj; int myIvar; self blockMyClass.m myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", myIvar); }];
  • 16. Blocks myObjMyClass.h MyObject* myObj; int myIvar; self blockMyClass.m __block MyClass* weakSelf = self; myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", weakSelf-> myIvar); }];
  • 17. Blocksdispatch_block_t block; int* pInt;if ( ... ) { if ( ... ) { int a = 1; block = ^{ ... } ; pInt = &a;} else { } else { int b = 1; block = ^{ ... } ; pInt = &b;} }block(); // utilisation de pInt
  • 18. Blocksdispatch_block_t block;if ( ... ) { block = [ [^{ ... } copy] autorelease] ;} else { block = [ [^{ ... } copy] autorelease] ;}block();
  • 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
  • 26. ARC blocks
  • 27. ARCdispatch_block_t block;if ( ... ) { block = ^{ ... } ;} else { block = ^{ ... } ;}block();