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

  • 3,444 views
Uploaded 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 …

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.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
3,444
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
12
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. CocoaHeads Rennes #9 Thomas Dupont 12 avril 2012 Gestion Mémoire du débutant à l’expert
  • 2. Sommaire• Gestion mémoire• Compteur de références• Properties• Blocks• ARC
  • 3. •Gestion mémoire 7 6 5 4 sp co if (b) { 3 int y = 3; 2 } 1 0 stack
  • 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. •Gestion mémoire malloc free heap
  • 6. Compteur de références NSObject retain release 2 1 0
  • 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. 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. Compteur de références 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 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
  • 26. ARC blocks
  • 27. ARCdispatch_block_t block;if ( ... ) { block = ^{ ... } ;} else { block = ^{ ... } ;}block();
  • 28. ARCMyClass.h MyObject* myObj; int myIvar;MyClass.m __block __unsafe_unretained MyClass* weakSelf = self; myObj = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", weakSelf->myIvar); }];
  • 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. ARC Core Foundation
  • 31. ARCNSString* myNSString = ( __bridge NSString*) myCFString;NSDictionary* dict = ( __bridge_transfer NSDictionary*) CFDictionaryCreate(...);CFArrayRef aray = ( __bridge_retained CFArrayRef) [[NSArray alloc] init];
  • 32. ARC Project configuration
  • 33. ARC
  • 34. ARC -fobjc-arc -fno-objc-arc
  • 35. ARC- (NSString*) copyRightLicense { return license; Non-ARC compiled}- (void) checkLicense { NSString* l = [license copyRightLicense]; ARC compiled ... objc_release ( l );}
  • 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. ARC- (NSString*) copyRightLicense NS_RETURNS_NOT_RETAINED ;+ (License*) createLicense NS_RETURNS_RETAINED ;
  • 38. CocoaHeads Rennes #9 julien@cocoaheads.fr 12 avril 2012 thomas.dupont@cocoaheads.fr Merci
  • 39. ARCpour ou contre ?