144 advanced objectivec and garbage collection techniques

Upload: msamuelf

Post on 05-Apr-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    1/55

    Greg ParkerRuntime Wrangler

    2

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    2/55

    The two faces of Objective-C

    Language and Runtime techniques

    Block esoterica

    Optimizing garbage-collected memory

    3

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    3/55

    4

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    4/55

    The Modern runtime

    The Legacy runtime

    5

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    5/55

    Legacy Modern

    32-bit Mac OS

    iPhone OS Simulator

    64-bit Mac OS

    iPhone OS devices

    6

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    6/55

    Legacy Modern

    32-bit Mac OS

    iPhone OS Simulator

    64-bit Mac OS

    iPhone OS devices

    7

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    7/55

    Mac OS: 32-bit apps use legacy runtime Must be 64-bit only for some features

    iPhone OS: Simulator previously used legacy runtime May now use new features everywhere

    8

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    8/55

    9

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    9/55

    Writing code

    Not writing code

    Not executing code

    10

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    10/55

    Writing code Class extensions

    Not writing code @synthesized properties

    Not executing code Weak-linked classes

    11

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    11/55

    An additional @interface

    Same @implementation

    Different header file

    @interface MyClass ()-(id)myInternalMethod;@property id myInternalProperty;@end

    12

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    12/55

    PetShopView.h

    @interface PetShopView : NSView

    @property (readwrite) int puppyFood;

    -(void) feedSnakeWith:(id)food;

    @end

    @private

    NSArray *kittens;NSArray *puppies;

    }

    {

    PetShopView *shop;shop.puppyFood = 0;[shop feedSnakeWith:shop.kittens];

    13

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    13/55

    @end

    PetShopView.h

    @interface PetShopView : NSView

    @property (readonly) int puppyFood;

    PetShopView-Private.h

    @interface PetShopView ()

    -(void) feedSnakeWith:(id)food;

    @end

    @private

    NSArray *kittens;NSArray *puppies;

    }

    {

    @property (readwrite) int puppyFood;

    14

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    14/55

    @end

    PetShopView.h

    @interface PetShopView : NSView

    @property (readonly) int puppyFood;

    PetShopView-Private.h

    @private

    NSArray *kittens;NSArray *puppies;

    }

    {@interface PetShopView ()

    @end

    @property (readwrite) int puppyFood;

    -(void) feedSnakeWith:(id)food;

    15

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    15/55

    @private by default

    Modern runtime only

    LLVM Compiler only Preview: Other C Flags = -Xclang -fobjc-nonfragile-abi2

    16

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    16/55

    @end

    PetShopView.h

    @interface PetShopView : NSView

    @property (readwrite) int puppyFood;

    PetShopView.m

    @implementation PetShopView

    @synthesize puppyFood;

    -(id) init {self = [super init];self->puppyFood = 10;return self;

    }

    @end

    {

    @privateint puppyFood;

    }

    17

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    17/55

    Modern runtime only

    LLVM Compiler only Preview: Other C Flags = -Xclang -fobjc-nonfragile-abi2

    18

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    18/55

    Write accessor methods by hand

    @dynamic with message forwarding

    @dynamic with dynamic method resolution

    @dynamic with NSManagedObject

    19

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    19/55

    if (NSDrawNinePartImage != NULL) {NSDrawNinePartImage(...);

    } else {// draw something else

    }

    20

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    20/55

    Class popoverClass = NSClassFromString(@UIPopoverController);if (popoverClass) {

    UIPopoverController *obj = [[popoverClass alloc] init];} else {

    // do something else

    }

    @interface MyController : UIPopoverController// crashes@end

    MyController *obj = [[MyController alloc] init];

    // sorry

    21

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    21/55

    if ([UIPopoverController class]) {UIPopoverController *obj = [[UIPopoverController alloc] init];

    } else {// do something else

    }

    @interface MyController : UIPopoverController// OK@end

    MyController *obj = [[MyController alloc] init];if (obj) {

    // OK}

    22

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    22/55

    Simplify deployment to multiple OS versions

    Implementation forthcoming

    Compiler support GCC and LLVM compilers in Xcode 4

    Runtime support iPhone OS 3.1 and later

    Not yet on Mac OS

    SDK support Not yet on iPhone OS

    Not yet on Mac OS

    23

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    23/55

    24

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    24/55

    Block memory in action

    Copying blocks

    __block storage variables

    25

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    25/55

    block2:const int captured = 10;

    __block int shared;

    int captured = 10;

    block1:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block1 copy];

    Heap

    Stack

    Function()

    26

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    26/55

    block2:const int captured = 10;block1:const int captured = 10;

    __block int shared;

    int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block1 copy];

    Heap

    Stack

    Function()

    27

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    27/55

    block2:const int captured = 10;block1:const int captured = 10;

    __block int shared;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block1 copy];

    Heap

    Stack

    Function()

    int captured = 10;int captured = 20;int captured = 20;

    28

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    28/55

    block3:const int captured = 10;

    block1:const int captured = 10;

    block2:const int captured = 10;

    Heap

    Stack

    Function()

    int captured = 20;

    __block int shared;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block1 copy];

    29

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    29/55

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    Heap

    Stack

    Function()

    block2:const int captured = 10;

    block3:const int captured = 10;

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block1 copy];

    30

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    30/55

    Heap

    Stack

    Function()

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    block2 and block3:const int captured = 10;

    block2:const int captured = 10;

    31

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    31/55

    Heap

    Stack

    Function()

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    block2 and block3:const int captured = 10;

    block2 and block3:const int captured = 10;

    32

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    32/55

    Heap

    Stack

    Function()

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    block2 and block3:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    33

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    33/55

    Heap

    Stack

    Function()

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    34

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    34/55

    Heap

    Stack

    Function()

    int captured = 20;

    __block int shared;

    block1:const int captured = 10;

    captured = 10;block1 = ^{shared += captured;

    };

    captured = 20;block2 = [block1 copy];block3 = [block2 copy];

    block2 and block3:const int captured = 10;

    35

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    35/55

    __block int shared;

    Heap

    Stack

    Function()

    block2 and block3:const int captured = 10;

    36

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    36/55

    Heap

    Stack

    Function()

    37

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    37/55

    Outlive the creating function

    Runnable on another thread GC: must copy even if you run it synchronously!

    38

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    38/55

    [myBlock copy] and [myBlock release]

    Block_copy(myBlock) and Block_release(myBlock)

    Prefer the methods, not the functions

    39

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    39/55

    __block is a storage class

    __block variables are mutable

    __block variables are shared

    40

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    40/55

    __block variable values are not retained

    __block variables may be copied

    __block arrays are not allowed

    41

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    41/55

    Send values between different calls to the same block

    Send values to the blocks caller

    Beware of thread synchronization

    42

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    42/55

    43

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    43/55

    Leak: an allocation that is no longer referenced

    Abandoned: an allocation that is referenced, but no longer used

    44

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    44/55

    Finds Leaked memory

    Does not find Abandoned memory

    45

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    45/55

    Automatically deallocates Leaked memory

    Does not deallocate Abandoned memory

    46

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    46/55

    Write-only cache

    Add-only container

    Pointer to current document

    Un-drained autorelease pool

    47

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    47/55

    48

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    48/55

    Limit cache sizes

    Add explicit invalidation protocols

    Use __weak pointers

    Add well-placed autorelease pools

    49

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    49/55

    Use leak detectors to find leaked memory GC: works with unmanaged and collector-disabled memory

    Use Heapshot to find abandoned memory GC: set AUTO_USE_TLC = NO

    50

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    50/55

    Runtime count reduced on iPhone OS

    Old language features given new twists

    Block objects demystified

    GC memory optimized

    51

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    51/55

    Michael JurewitzDeveloper Tools Evangelist

    [email protected]

    Documentation

    The Objective-C Programming LanguageObjective-C Runtime Programming Guidehttp://developer.apple.com/

    Apple Developer Forumshttp://devforums.apple.com

    52

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    52/55

    Advanced Memory Analysis with Instruments PresidioThursday 11:30AM

    Introducing Blocks and Grand Central Dispatch on iPhone (Repeat) Pacific HeightsFriday 2:00PM

    53

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    53/55

    54

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    54/55

    55

  • 8/2/2019 144 Advanced Objectivec and Garbage Collection Techniques

    55/55

    56