SlideShare a Scribd company logo
1 of 26
Download to read offline
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 메소드 그룹이 아닌 다른 메소드를 사용해
야 하는데, 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

What's hot

Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2Injae Lee
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Younghan Kim
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsHyuncheol Jeon
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스Lee Dong Wook
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차HyunJoon Park
 
[Swift] Properties
[Swift] Properties[Swift] Properties
[Swift] PropertiesBill Kim
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
Effective java
Effective javaEffective java
Effective javaHaeil Yi
 
실용주의 아키텍트
실용주의 아키텍트실용주의 아키텍트
실용주의 아키텍트Haeil Yi
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Younghan Kim
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3성연 김
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012Daum DNA
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)MIN SEOK KOO
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPTJinKyoungHeo
 

What's hot (19)

Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
 
[Swift] Properties
[Swift] Properties[Swift] Properties
[Swift] Properties
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
Effective java
Effective javaEffective java
Effective java
 
실용주의 아키텍트
실용주의 아키텍트실용주의 아키텍트
실용주의 아키텍트
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Java JPA
Java JPAJava JPA
Java JPA
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPT
 

Viewers also liked

차세대컴파일러, VM의미래: 애플 오픈소스 LLVM
차세대컴파일러, VM의미래: 애플 오픈소스 LLVM차세대컴파일러, VM의미래: 애플 오픈소스 LLVM
차세대컴파일러, VM의미래: 애플 오픈소스 LLVMJung Kim
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDBNakCheon Jung
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Samsung Electronics
 
Python + GDB = Javaデバッガ
Python + GDB = JavaデバッガPython + GDB = Javaデバッガ
Python + GDB = JavaデバッガKenji Kazumura
 
GDB: A Lot More Than You Knew
GDB: A Lot More Than You KnewGDB: A Lot More Than You Knew
GDB: A Lot More Than You KnewUndo
 
Thesis - LLVM toolchain support as a plug-in for Eclipse CDT
Thesis - LLVM toolchain support as a plug-in for Eclipse CDTThesis - LLVM toolchain support as a plug-in for Eclipse CDT
Thesis - LLVM toolchain support as a plug-in for Eclipse CDTTuononenP
 
Reverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxReverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxRick Harris
 
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹Daniel Juyung Seo
 
03_iOS개발환경
03_iOS개발환경03_iOS개발환경
03_iOS개발환경성관 윤
 
LAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel AwarenessLAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel AwarenessLinaro
 
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기Wonha Ryu
 
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기Soojin Ro
 
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기NAVER D2
 
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기NAVER D2
 
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점Wonha Ryu
 
분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기NAVER D2
 

Viewers also liked (19)

llvm 소개
llvm 소개llvm 소개
llvm 소개
 
차세대컴파일러, VM의미래: 애플 오픈소스 LLVM
차세대컴파일러, VM의미래: 애플 오픈소스 LLVM차세대컴파일러, VM의미래: 애플 오픈소스 LLVM
차세대컴파일러, VM의미래: 애플 오픈소스 LLVM
 
Llvm
LlvmLlvm
Llvm
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900
 
Objc literals
Objc literalsObjc literals
Objc literals
 
Python + GDB = Javaデバッガ
Python + GDB = JavaデバッガPython + GDB = Javaデバッガ
Python + GDB = Javaデバッガ
 
GDB: A Lot More Than You Knew
GDB: A Lot More Than You KnewGDB: A Lot More Than You Knew
GDB: A Lot More Than You Knew
 
Thesis - LLVM toolchain support as a plug-in for Eclipse CDT
Thesis - LLVM toolchain support as a plug-in for Eclipse CDTThesis - LLVM toolchain support as a plug-in for Eclipse CDT
Thesis - LLVM toolchain support as a plug-in for Eclipse CDT
 
Reverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxReverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on Linux
 
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹
Open Platform Tizen and Web, 오픈 플랫폼 타이젠과 웹
 
03_iOS개발환경
03_iOS개발환경03_iOS개발환경
03_iOS개발환경
 
LAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel AwarenessLAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel Awareness
 
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
 
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
 
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
 
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
 
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
 
분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기
 

Similar to LLVM ARC

9 object class
9 object class9 object class
9 object class웅식 전
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3현찬 양
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2흥래 김
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2세빈 정
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2Daniel Lim
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해seungkyu park
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swiftNAVER D2
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차HyunJoon Park
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 

Similar to LLVM ARC (20)

I os 2
I os 2I os 2
I os 2
 
9 object class
9 object class9 object class
9 object class
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
Boost
BoostBoost
Boost
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swift
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
Java script
Java scriptJava script
Java script
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 

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 메소드 그룹이 아닌 다른 메소드를 사용해 야 하는데, 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