Top Banner

of 55

144 Advanced Objectivec and Garbage Collection Techniques

Apr 05, 2018

Download

Documents

msamuelf
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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