CocoaHeads Rennes #9                                                Thomas Dupont    12 avril 2012               Gestion M...
Sommaire• Gestion mémoire• Compteur de références• Properties• Blocks• ARC
•Gestion mémoire 7 6 5 4                 sp   co   if (b) { 3                               int y = 3; 2                  ...
•Gestion mémoire 7 6     adresse de retour : 4   sp 5          variable y 4                                  co   if (b) {...
•Gestion mémoire                   malloc                    free           heap
Compteur de références          NSObject                         retain                         release          2        ...
Compteur de références      ‣ Vous êtes responsable des objets que vous créez      ‣ Vous pouvez devenir responsable d’un ...
Compteur de références                        + (MyObject*)fetchMyObject; MyObject* obj = [MyObject fetchMyObject];+ (id)a...
Compteur de références                          autoreleaserun loop                                 autoreleasepool       ...
Properties@property (attributes) NSObject* myObj;@synthesize myObj;                   getter=                   setter=   ...
Blocks  dispatch_block_t myBlock = ^{ myView.alpha = 0; } ;  [UIView animateWithDuration:0.5 animations: myBlock ];
Blocks         __block int a = 3;         void (^incrementA)(void) = ^{ a++; };         incrementA();
Blocks         __block NSObject* myObj;         void (^foo)(void) = ^{ [myObj foo]; };         foo();
BlocksMyClass.h MyObject* myObj; int myIvar;MyClass.m void (^foo)(void) = ^{    myIvar++;    [myObj foo]; };  foo();
Blocks                                                      myObjMyClass.h MyObject* myObj; int myIvar;                   ...
Blocks                                                      myObjMyClass.h MyObject* myObj; int myIvar;                   ...
Blocksdispatch_block_t block;    int* pInt;if ( ... ) {               if ( ... ) {                                 int a =...
Blocksdispatch_block_t block;if ( ... ) {      block = [ [^{ ... } copy]   autorelease] ;} else {      block = [ [^{ ... }...
ARC@implementation Stack { NSMutableArray *array; }- (id) init {   if (self = [super init])      array = [NSMutableArray a...
ARC@implementation Stack { NSMutableArray *array; }- (id) init {   if (self = [super init])      array = [ [NSMutableArray...
ARC                          It just works !      Insertion automatique de retain, release et autorelease              Oub...
ARC                                          __strong                       valeur par défaut                             ...
ARC                              __unsafe_unretained           ne devient pas responsable                                 ...
ARC                                    __weak                                             ne devient pas responsable  util...
ARC@property (strong) id x;              // __strong ,              a.k.a retain@property (unsafe_unretained) id y;   // _...
ARC      blocks
ARCdispatch_block_t block;if ( ... ) {      block = ^{ ... } ;} else {      block = ^{ ... } ;}block();
ARCMyClass.h MyObject* myObj; int myIvar;MyClass.m  __block __unsafe_unretained MyClass* weakSelf = self;  myObj = [[MyObj...
ARCMyClass.h MyObject* myObj; int myIvar;MyClass.m  __weak MyClass* weakSelf = self;  myObj = [[MyObject alloc] initWithBl...
ARC      Core Foundation
ARCNSString* myNSString = ( __bridge NSString*) myCFString;NSDictionary* dict = ( __bridge_transfer NSDictionary*) CFDicti...
ARC      Project configuration
ARC
ARC      -fobjc-arc   -fno-objc-arc
ARC- (NSString*) copyRightLicense {    return license;                              Non-ARC compiled}- (void) checkLicense...
ARC+ (License*) createLicense {    return [[self alloc] init];                                    Non-ARC compiled}- (void...
ARC- (NSString*) copyRightLicense   NS_RETURNS_NOT_RETAINED ;+ (License*) createLicense       NS_RETURNS_RETAINED ;
CocoaHeads Rennes #9           julien@cocoaheads.fr    12 avril 2012              thomas.dupont@cocoaheads.fr             ...
ARCpour ou contre ?
Upcoming SlideShare
Loading in...5
×

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

3,638
-1

Published on

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.

Published in: Technology, Business, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,638
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. CocoaHeads Rennes #9 Thomas Dupont 12 avril 2012 Gestion Mémoire du débutant à l’expert
  2. 2. Sommaire• Gestion mémoire• Compteur de références• Properties• Blocks• ARC
  3. 3. •Gestion mémoire 7 6 5 4 sp co if (b) { 3 int y = 3; 2 } 1 0 stack
  4. 4. •Gestion mémoire 7 6 adresse de retour : 4 sp 5 variable y 4 co if (b) { 3 int y = 3; 2 } 1 0 stack
  5. 5. •Gestion mémoire malloc free heap
  6. 6. Compteur de références NSObject retain release 2 1 0
  7. 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 Cmétaphore du chien 2 1 0 3 chien A B
  8. 8. Compteur de références + (MyObject*)fetchMyObject; MyObject* obj = [MyObject fetchMyObject];+ (id)alloc- (id)init+ (id)new Conventions de nommage- (id)copy- (id)mutableCopy
  9. 9. Compteur de références autoreleaserun loop autoreleasepool 1 0 obj obj
  10. 10. Properties@property (attributes) NSObject* myObj;@synthesize myObj; getter= setter= assign nonatomic retain readonly copy readwrite
  11. 11. Blocks dispatch_block_t myBlock = ^{ myView.alpha = 0; } ; [UIView animateWithDuration:0.5 animations: myBlock ];
  12. 12. Blocks __block int a = 3; void (^incrementA)(void) = ^{ a++; }; incrementA();
  13. 13. Blocks __block NSObject* myObj; void (^foo)(void) = ^{ [myObj foo]; }; foo();
  14. 14. BlocksMyClass.h MyObject* myObj; int myIvar;MyClass.m void (^foo)(void) = ^{ myIvar++; [myObj foo]; }; foo();
  15. 15. Blocks myObjMyClass.h MyObject* myObj; int myIvar; self blockMyClass.m myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", myIvar); }];
  16. 16. Blocks myObjMyClass.h MyObject* myObj; int myIvar; self blockMyClass.m __block MyClass* weakSelf = self; myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", weakSelf-> myIvar); }];
  17. 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. 18. Blocksdispatch_block_t block;if ( ... ) { block = [ [^{ ... } copy] autorelease] ;} else { block = [ [^{ ... } copy] autorelease] ;}block();
  19. 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. 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. 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. 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. 23. ARC __unsafe_unretained ne devient pas responsable utilisé pour éviter les deadlocks- (void) dealloc { [myTableView setDelegate:nil]; [myTableView setDataSource:nil];}
  24. 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. 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. 26. ARC blocks
  27. 27. ARCdispatch_block_t block;if ( ... ) { block = ^{ ... } ;} else { block = ^{ ... } ;}block();
  28. 28. ARCMyClass.h MyObject* myObj; int myIvar;MyClass.m __block __unsafe_unretained MyClass* weakSelf = self; myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", weakSelf->myIvar); }];
  29. 29. ARCMyClass.h MyObject* myObj; int myIvar;MyClass.m __weak MyClass* weakSelf = self; myObj = [[MyObject alloc] initWithBlock:^{ MyObject* strongSelf = weakSelf if (strongSelf) NSLog(@"%i", strongSelf-> myIvar); }];
  30. 30. ARC Core Foundation
  31. 31. ARCNSString* myNSString = ( __bridge NSString*) myCFString;NSDictionary* dict = ( __bridge_transfer NSDictionary*) CFDictionaryCreate(...);CFArrayRef aray = ( __bridge_retained CFArrayRef) [[NSArray alloc] init];
  32. 32. ARC Project configuration
  33. 33. ARC
  34. 34. ARC -fobjc-arc -fno-objc-arc
  35. 35. ARC- (NSString*) copyRightLicense { return license; Non-ARC compiled}- (void) checkLicense { NSString* l = [license copyRightLicense]; ARC compiled ... objc_release ( l );}
  36. 36. ARC+ (License*) createLicense { return [[self alloc] init]; Non-ARC compiled}- (void) checkLicense { __strong License* l = objc_retain ( [License createLicense] ) ; ARC compiled ... objc_release ( l );}
  37. 37. ARC- (NSString*) copyRightLicense NS_RETURNS_NOT_RETAINED ;+ (License*) createLicense NS_RETURNS_RETAINED ;
  38. 38. CocoaHeads Rennes #9 julien@cocoaheads.fr 12 avril 2012 thomas.dupont@cocoaheads.fr Merci
  39. 39. ARCpour ou contre ?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×