際際滷

際際滷Share a Scribd company logo
LLVM ARC
(Automatic Reference Counting)
2014 襴豺TV 蠍一郁規 覈覦手覦 iOS 
谿曙
1
What is the ARC?
2
ARC ON/OFF
3
 Compile option
 -fobjc-arc (on)
 -fno-objc-arc (off)
 Warning Message
#if !__has_feature(objc_arc)
#warning "企 蠍磯レ ARC 蟆曙 ."
#endif
蟠 keyword
__strong
__weak
__unsafe_unretained
__autoreleasing
4
__strong keyword
 螳豌 一危  蠍磯蓋螳.
{
// #1 (覓旧朱  れ)
id obj = [[NSObject alloc] init];
}
{
// #2 (覈朱  れ)
id __strong obj = [[NSObject alloc] init];
}
5
__strong keyword
 覈譯手鍵 - 讌覲 case
- (void)test
{
{
// 螳豌企ゼ 燕螻 蟠 螳.
id __strong obj = [[NSObject alloc] init];
}
// obj 覲螳 scope襯 覯企覃 螳 谿語^ 殊.
// 螳豌企 朱 襴企Μる螻, 覓企 螳豌伎  蟠 蠍 覓語 螳豌企 殊.
}
6
__strong keyword
 覈譯手鍵 - 覃る覲 case
@interface TestObject : NSObject
{
id __strong _obj;
}
- (void)setObject:(id __strong)obj;
@end
 企 螳豌願 覃碁  覃る覲 蟠 蟇磯螻,
覃る覲 豪 螳豌願 企蟲 讌 
覃, 覃る覲 豪 螳豌企 覃碁.
7
__strong keyword
 Practice
id __strong obj0 = [[NSObject alloc] init];
id __strong obj1 = [[NSObject alloc] init];
id __strong obj2 = nil;
obj0 = obj1;
obj2 = obj0;
obj1 = nil;
obj0 = nil;
obj2 = nil;
8
__weak keyword
 谿語^襯 覦讌蠍  keyword
 螳豌企ゼ 讌 
 谿語^ : 襦るジ 螳豌願 襦
蟠 螳螻  襦, 螳豌願
蟇磯伎   蟇 讌 螻
覃覈襴 譟伎 
9
__weak keyword
{
// Bad case
// warning: Assigning retained object to weak variable;
// object will be released after assignment
id __weak obj = [[NSObject alloc] init];
}
{
// Good case
id __strong obj0 = [[NSObject alloc] init];
id __weak obj1 = obj0;
}
10
__weak keyword
 渚 谿語^ 殊. (螳豌願 覃碁覃 nil れ)
id __weak obj1 = nil;
{
id __strong obj0 = [[NSObject alloc] init];
obj1 = obj0;
NSLog(@"%@", obj1);
}
NSLog(@"%@", obj1);
2014-01-10 14:34:39.709 test[5798:70b] <NSObject: 0x8d61460>
2014-01-10 14:34:39.710 test[5798:70b] (null)
11
__unsafe_unretained keyword
 企 れ襦 れ 覲 貉危朱 ARC 豈
碁. 覓語, 讌覲襯 蟯襴 譯殊伎 .
 __weak  襷谿螳讌襦 螳豌伎 蟠 螳讌 .
 __weak  るジ  螳豌 覃  nil れ 讌 
.
12
__autoreleasing keyword
 @autoreleasepool 觚襦 磯ジ 覈 譯手鍵襯 螳襦 
.
@autoreleasepool {
// @autoreleasepool block 殊  蟷 覃碁.
id __autoreleasing obj = [[NSObject alloc] init];
}
13
__autoreleasing keyword
 覃 覈覈 蠏豺 讌貅 . (貉危朱螳 覃
企 磯 __autoreleasing 豌襴蠍 覓)
 螳豌企ゼ 燕讌 螻 詞伎るる alloc/new/copy/
mutableCopy 覃 蠏碁9  るジ 覃襯 
 , init 螻 覃襯 誤 るジ 覃 覦
 螳豌企 貉危朱螳 朱 @autoreleasepool
block 焔 .
14
__autoreleasing keyword
@autoreleasepool {
/*
* 1. 覲 obj __strong れ 磯 螳豌 蟠 螳讌. (+1)
* 2. +[NSMutableArray array] 覃 企 覲願 貉危朱螳
* @autoreleasepool block  焔. (+2)
*/
id __strong obj = [NSMutableArray array];
}
/*
* 覲 obj scope襯 覯企 蟠 伎牡. (螳豌 襴企Μ讀) (+1)
* @autoreleasepool block 殊覃伎 焔 覈 螳豌 襴企Μ讀. (0)
*/
15
__autoreleasing keyword
 id or 螳豌 一危壱 誤磯 蠍磯蓋朱 __autoreleasing 
煙 螳.
{
// 貉危 る
NSError *error = nil;
// NSError * __strong error = nil; (覲蟆暑 貊)
NSError **pError = &error;
// NSError * __autoreleasing *pError = &error; (覲蟆暑 貊)
}
{
//  貉危
NSError *error = nil;
// NSError * __strong error = nil; (覲蟆暑 貊)
NSError * __strong *pError = &error;
}
16
蠏豺
 retain, release, retainCount, autorelease 企.
 NSAllocateObject and NSDeallocateObject 企.
 螳豌 煙 蟯 覃 覈 蠏豺 磯朱.
 dealloc  企.
 NSAutoreleasePool  @autoreleasepool .
 Zone(NSZone) 企.
 螳豌  覲れ C 語伎 蟲譟一牡 or 螻旧豌伎 覃る螳   .
 id and void *  覈朱  覲伎 .
17
蠏豺
螳豌 煙 蟯 覃 覈 蠏豺 磯朱.
 alloc
 new
 copy
 mutableCopy
  覈襦 譴 襦  method 螳豌願 覦
 method襯 語 螳豌企 蟠 螳蟆 . (non-arc, arc
覈 企麹 伎)
18
蠏豺
螳豌 煙 蟯 覃 覈 蠏豺 磯朱.
 init
  method 語ろ伎 method .
  method 螳豌企ゼ 覦伎 .
 覦  id 伎伎 .  企 企,  企,
觚 企れ 螳豌伎伎伎 .
// good
- (id)initWithObject:(id)obj;
// bad
+ (id)initWithObject:(id)obj;
// bad
- (void)initThisObject;
// usable
- (void)initialize;
19
蠏豺
dealloc 覈 語 企錫
- (void)dealloc
{
//  伎 貊...
free(_buffer);
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 讌 .
// [super dealloc];
}
20
蠏豺
螳豌  覲れ C 語伎 蟲譟一牡 or 螻旧豌伎 覃る螳   .
 C 蟲譟一牡 覃るれ 覲願 蠍 覓語 貉危朱螳 C 蟲譟一牡
 覃覈襴襯 蟯襴 蟆 覿螳ロ.
// 貉危 
struct Data {
NSString *name;
};
// 貉危 
struct Data {
NSString * __unsafe_unretained name;
};
21
蠏豺
id and void *  覈朱  覲伎 .
 __bridge cast
  麹  
- (void)test
{
id obj = [[NSObject alloc] init];
{
// 貉危 る
void *ptr = obj;
}
{
// 貉危 
void *ptr = (__bridge void *)obj;
}
}
22
蠏豺
id and void *  覈朱  覲伎 .
 __bridge_retained cast
 麹 覲螳 螳豌伎 蟠 螳讌 蟆朱 .
{
// ARC
NSArray *array = [[NSArray alloc] init];
CFArrayRef arrayRef = (__bridge_retained CFArrayRef)array;
}
{
// non-ARC
NSArray *array = [[NSArray alloc] init];
CFArrayRef arrayRef = (CFArrayRef)[array retain];
}
23
蠏豺
id and void *  覈朱  覲伎 .
 __bridge_transfer cast
 轟  讌 螳豌企ゼ 襴企Μ讀 .
{
// ARC
void *p = (__bridge_retained void *)[[NSObject alloc] init];
NSLog(@"class = %@", [(__bridge id)p class]);
(void)(__bridge_transfer id)p;
}
{
// non-ARC
void *p = (void *)[[NSObject alloc] init];
NSLog(@"class = %@", [(id)p class]);
[(id)p release];
}
24
蠏豺
id and void *  覈朱  覲伎 .
NS_INLINE CF_RETURNS_RETAINED CFTypeRef CFBridgingRetain(id X) {
return (__bridge_retained CFTypeRef)X;
}
NS_INLINE id CFBridgingRelease(CFTypeRef CF_CONSUMED X) {
return (__bridge_transfer id)X;
}
25
谿瑚
 iOS OS X 覃覈襴 蟯襴 覃一る 蠍磯 (讌れ) -
螳讀 豺企, 覈貊 襭覈(讌), OSXDEV(
蟾)
26

More Related Content

LLVM ARC

  • 1. LLVM ARC (Automatic Reference Counting) 2014 襴豺TV 蠍一郁規 覈覦手覦 iOS 谿曙 1
  • 2. What is the ARC? 2
  • 3. ARC ON/OFF 3 Compile option -fobjc-arc (on) -fno-objc-arc (off) Warning Message #if !__has_feature(objc_arc) #warning "企 蠍磯レ ARC 蟆曙 ." #endif
  • 5. __strong keyword 螳豌 一危 蠍磯蓋螳. { // #1 (覓旧朱 れ) id obj = [[NSObject alloc] init]; } { // #2 (覈朱 れ) id __strong obj = [[NSObject alloc] init]; } 5
  • 6. __strong keyword 覈譯手鍵 - 讌覲 case - (void)test { { // 螳豌企ゼ 燕螻 蟠 螳. id __strong obj = [[NSObject alloc] init]; } // obj 覲螳 scope襯 覯企覃 螳 谿語^ 殊. // 螳豌企 朱 襴企Μる螻, 覓企 螳豌伎 蟠 蠍 覓語 螳豌企 殊. } 6
  • 7. __strong keyword 覈譯手鍵 - 覃る覲 case @interface TestObject : NSObject { id __strong _obj; } - (void)setObject:(id __strong)obj; @end 企 螳豌願 覃碁 覃る覲 蟠 蟇磯螻, 覃る覲 豪 螳豌願 企蟲 讌 覃, 覃る覲 豪 螳豌企 覃碁. 7
  • 8. __strong keyword Practice id __strong obj0 = [[NSObject alloc] init]; id __strong obj1 = [[NSObject alloc] init]; id __strong obj2 = nil; obj0 = obj1; obj2 = obj0; obj1 = nil; obj0 = nil; obj2 = nil; 8
  • 9. __weak keyword 谿語^襯 覦讌蠍 keyword 螳豌企ゼ 讌 谿語^ : 襦るジ 螳豌願 襦 蟠 螳螻 襦, 螳豌願 蟇磯伎 蟇 讌 螻 覃覈襴 譟伎 9
  • 10. __weak keyword { // Bad case // warning: Assigning retained object to weak variable; // object will be released after assignment id __weak obj = [[NSObject alloc] init]; } { // Good case id __strong obj0 = [[NSObject alloc] init]; id __weak obj1 = obj0; } 10
  • 11. __weak keyword 渚 谿語^ 殊. (螳豌願 覃碁覃 nil れ) id __weak obj1 = nil; { id __strong obj0 = [[NSObject alloc] init]; obj1 = obj0; NSLog(@"%@", obj1); } NSLog(@"%@", obj1); 2014-01-10 14:34:39.709 test[5798:70b] <NSObject: 0x8d61460> 2014-01-10 14:34:39.710 test[5798:70b] (null) 11
  • 12. __unsafe_unretained keyword 企 れ襦 れ 覲 貉危朱 ARC 豈 碁. 覓語, 讌覲襯 蟯襴 譯殊伎 . __weak 襷谿螳讌襦 螳豌伎 蟠 螳讌 . __weak るジ 螳豌 覃 nil れ 讌 . 12
  • 13. __autoreleasing keyword @autoreleasepool 觚襦 磯ジ 覈 譯手鍵襯 螳襦 . @autoreleasepool { // @autoreleasepool block 殊 蟷 覃碁. id __autoreleasing obj = [[NSObject alloc] init]; } 13
  • 14. __autoreleasing keyword 覃 覈覈 蠏豺 讌貅 . (貉危朱螳 覃 企 磯 __autoreleasing 豌襴蠍 覓) 螳豌企ゼ 燕讌 螻 詞伎るる alloc/new/copy/ mutableCopy 覃 蠏碁9 るジ 覃襯 , init 螻 覃襯 誤 るジ 覃 覦 螳豌企 貉危朱螳 朱 @autoreleasepool block 焔 . 14
  • 15. __autoreleasing keyword @autoreleasepool { /* * 1. 覲 obj __strong れ 磯 螳豌 蟠 螳讌. (+1) * 2. +[NSMutableArray array] 覃 企 覲願 貉危朱螳 * @autoreleasepool block 焔. (+2) */ id __strong obj = [NSMutableArray array]; } /* * 覲 obj scope襯 覯企 蟠 伎牡. (螳豌 襴企Μ讀) (+1) * @autoreleasepool block 殊覃伎 焔 覈 螳豌 襴企Μ讀. (0) */ 15
  • 16. __autoreleasing keyword id or 螳豌 一危壱 誤磯 蠍磯蓋朱 __autoreleasing 煙 螳. { // 貉危 る NSError *error = nil; // NSError * __strong error = nil; (覲蟆暑 貊) NSError **pError = &error; // NSError * __autoreleasing *pError = &error; (覲蟆暑 貊) } { // 貉危 NSError *error = nil; // NSError * __strong error = nil; (覲蟆暑 貊) NSError * __strong *pError = &error; } 16
  • 17. 蠏豺 retain, release, retainCount, autorelease 企. NSAllocateObject and NSDeallocateObject 企. 螳豌 煙 蟯 覃 覈 蠏豺 磯朱. dealloc 企. NSAutoreleasePool @autoreleasepool . Zone(NSZone) 企. 螳豌 覲れ C 語伎 蟲譟一牡 or 螻旧豌伎 覃る螳 . id and void * 覈朱 覲伎 . 17
  • 18. 蠏豺 螳豌 煙 蟯 覃 覈 蠏豺 磯朱. alloc new copy mutableCopy 覈襦 譴 襦 method 螳豌願 覦 method襯 語 螳豌企 蟠 螳蟆 . (non-arc, arc 覈 企麹 伎) 18
  • 19. 蠏豺 螳豌 煙 蟯 覃 覈 蠏豺 磯朱. init method 語ろ伎 method . method 螳豌企ゼ 覦伎 . 覦 id 伎伎 . 企 企, 企, 觚 企れ 螳豌伎伎伎 . // good - (id)initWithObject:(id)obj; // bad + (id)initWithObject:(id)obj; // bad - (void)initThisObject; // usable - (void)initialize; 19
  • 20. 蠏豺 dealloc 覈 語 企錫 - (void)dealloc { // 伎 貊... free(_buffer); [[NSNotificationCenter defaultCenter] removeObserver:self]; // 讌 . // [super dealloc]; } 20
  • 21. 蠏豺 螳豌 覲れ C 語伎 蟲譟一牡 or 螻旧豌伎 覃る螳 . C 蟲譟一牡 覃るれ 覲願 蠍 覓語 貉危朱螳 C 蟲譟一牡 覃覈襴襯 蟯襴 蟆 覿螳ロ. // 貉危 struct Data { NSString *name; }; // 貉危 struct Data { NSString * __unsafe_unretained name; }; 21
  • 22. 蠏豺 id and void * 覈朱 覲伎 . __bridge cast 麹 - (void)test { id obj = [[NSObject alloc] init]; { // 貉危 る void *ptr = obj; } { // 貉危 void *ptr = (__bridge void *)obj; } } 22
  • 23. 蠏豺 id and void * 覈朱 覲伎 . __bridge_retained cast 麹 覲螳 螳豌伎 蟠 螳讌 蟆朱 . { // ARC NSArray *array = [[NSArray alloc] init]; CFArrayRef arrayRef = (__bridge_retained CFArrayRef)array; } { // non-ARC NSArray *array = [[NSArray alloc] init]; CFArrayRef arrayRef = (CFArrayRef)[array retain]; } 23
  • 24. 蠏豺 id and void * 覈朱 覲伎 . __bridge_transfer cast 轟 讌 螳豌企ゼ 襴企Μ讀 . { // ARC void *p = (__bridge_retained void *)[[NSObject alloc] init]; NSLog(@"class = %@", [(__bridge id)p class]); (void)(__bridge_transfer id)p; } { // non-ARC void *p = (void *)[[NSObject alloc] init]; NSLog(@"class = %@", [(id)p class]); [(id)p release]; } 24
  • 25. 蠏豺 id and void * 覈朱 覲伎 . NS_INLINE CF_RETURNS_RETAINED CFTypeRef CFBridgingRetain(id X) { return (__bridge_retained CFTypeRef)X; } NS_INLINE id CFBridgingRelease(CFTypeRef CF_CONSUMED X) { return (__bridge_transfer id)X; } 25
  • 26. 谿瑚 iOS OS X 覃覈襴 蟯襴 覃一る 蠍磯 (讌れ) - 螳讀 豺企, 覈貊 襭覈(讌), OSXDEV( 蟾) 26