144 advanced objectivec and garbage collection techniques
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
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