Download - iOS 메모리관리

Transcript
Page 1: iOS 메모리관리

iOS Memory Management

이영록

Page 2: iOS 메모리관리

실행시 메모리 구조

Page 3: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

Page 4: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text) 프로그램코드가����������� ������������������  저장

Page 5: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

프로그램코드가����������� ������������������  저장

Page 6: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

동적할당을����������� ������������������  위한����������� ������������������  공간

프로그램코드가����������� ������������������  저장

Page 7: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

동적할당을����������� ������������������  위한����������� ������������������  공간

지역변수와����������� ������������������  매개변수가����������� ������������������  저장

프로그램코드가����������� ������������������  저장

Page 8: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

동적할당을����������� ������������������  위한����������� ������������������  공간

지역변수와����������� ������������������  매개변수가����������� ������������������  저장

프로그램코드가����������� ������������������  저장}메모리����������� ������������������  사용량����������� ������������������  변동없음프로그램����������� ������������������  종료시����������� ������������������  해제

Page 9: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

동적할당을����������� ������������������  위한����������� ������������������  공간

지역변수와����������� ������������������  매개변수가����������� ������������������  저장

프로그램코드가����������� ������������������  저장}메모리����������� ������������������  사용량����������� ������������������  변동없음프로그램����������� ������������������  종료시����������� ������������������  해제

-객체가����������� ������������������  생성되는����������� ������������������  공간사용량이����������� ������������������  변동메모리관리의����������� ������������������  대상영역

Page 10: iOS 메모리관리

실행시 메모리 구조

Stack

Heap

Data

Code(Text)

전역변수와����������� ������������������  정적변수가����������� ������������������  저장

동적할당을����������� ������������������  위한����������� ������������������  공간

지역변수와����������� ������������������  매개변수가����������� ������������������  저장

프로그램코드가����������� ������������������  저장}메모리����������� ������������������  사용량����������� ������������������  변동없음프로그램����������� ������������������  종료시����������� ������������������  해제

-객체가����������� ������������������  생성되는����������� ������������������  공간사용량이����������� ������������������  변동메모리관리의����������� ������������������  대상영역

사용량이����������� ������������������  계속해서����������� ������������������  변경OS가����������� ������������������  관리-

Page 11: iOS 메모리관리

메모리-Code 영역

프로그램의����������� ������������������  명령문들-����������� ������������������  이����������� ������������������  명령문에����������� ������������������  의해����������� ������������������  프로그램은����������� ������������������  작동한다

Page 12: iOS 메모리관리

메모리-Data 영역

전역변수• 프로그램 전역에서 사용가능한변수

정적변수• 실행중에 항상 일정한 메모리 공간에 유지됨• 블럭을 벗어나도 자동으로 제거되지 않음

Page 13: iOS 메모리관리

메모리-Heap 영역

동적할당 변수• 프로그램 실행중에 Heap 영역으로부터 필요한 만큼 메모리를 할당받는다.• 사용이 완료되면 시스템에 반납하여야 한다• C언어에서는 malloc() 함수에 의해 할당• C++ 언어에서는 new 키워드에 의해 할당• Objective-C 언어에서는 alloc 메소드에 의해 할당장점• 효율적인 메모리 관리가 가능하다단점• 메모리 관리를 프로그래머가 책임지고 해야한다

Page 14: iOS 메모리관리

메모리-Stack 영역

지역변수• 함수나 블럭안에서 정의되는 변수• 함수가 종료되거나 프로그램이 종료되면 메모리 공간이 해제됨• 함수가 받는 매개 변수나 함수내에서 사용되는 지역변수가 이 Stack 영역에 저장( OS의 관리 )

Page 15: iOS 메모리관리

@interface ClassA : NSObject {}+ (void) imClassMethod- (void) methodA;@end

@implementation ClassA+ (void) imClassMethod { NSLog(@"I’m Class Method");}- (void) methodA { NSLog(@"I’m A");}@end

Page 16: iOS 메모리관리

@interface ClassB : ClassA {

}- (void) methodB;@end

@implementation ClassB- (void) methodB { NSLog(@"I’m B");}@end

Page 17: iOS 메모리관리

@interface ClassC : ClassB {

}- (void) methodC;@end

@implementation ClassC- (void) methodC { NSLog(@"I’m C");}@end

Page 18: iOS 메모리관리

int main (int argc, const char * argv[]) { ClassC *obj = [[ClassC alloc] init];

[obj methodC]; [obj methodB]; [obj methodA]; [obj methodX];NSNumber *num =[[NSNumber alloc] init];

return 0;

}

Page 19: iOS 메모리관리

Stack Heap

Code

Page 20: iOS 메모리관리

ClassC *obj = [[ClassC alloc] init];Stack Heap

Code

Page 21: iOS 메모리관리

ClassC *obj = [[ClassC alloc] init];Stack Heap

Code

ClassC

Page 22: iOS 메모리관리

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

ClassC의 Instance

Stack Heap

Code

ClassC

+alloc

Page 23: iOS 메모리관리

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

ClassC의 Instance

Stack Heap

Code

ClassC

-init+alloc

Page 24: iOS 메모리관리

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

ClassC의 Instance

obj

Stack Heap

Code

ClassC

-init+alloc

Page 25: iOS 메모리관리

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

ClassC의 Instance

obj

Stack Heap

Code

ClassC

-init+alloc

Page 26: iOS 메모리관리

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

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-init+alloc

Page 27: iOS 메모리관리

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

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-init+alloc

Page 28: iOS 메모리관리

ClassC의 Instance

obj isa

Stack Heap

Code

[obj methodC];

ClassC

-init+alloc

Page 29: iOS 메모리관리

ClassC의 Instance

obj isa

Stack Heap

Code

[obj methodC];

ClassC

-methodC-init+alloc

Page 30: iOS 메모리관리

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

[obj methodB];

-init+alloc

Page 31: iOS 메모리관리

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

[obj methodB];

super

-init+alloc

Page 32: iOS 메모리관리

ClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

[obj methodB];

super

-init+alloc

Page 33: iOS 메모리관리

ClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

[obj methodB];

super-methodB

-init+alloc

Page 34: iOS 메모리관리

ClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodB

[obj methodA];

-init+alloc

Page 35: iOS 메모리관리

ClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodB

[obj methodA];

super

-init+alloc

Page 36: iOS 메모리관리

ClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodB

[obj methodA];

super

-init+alloc

Page 37: iOS 메모리관리

ClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodB

[obj methodA];

super

-methodA-init+alloc

Page 38: iOS 메모리관리

ClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

-init+alloc

Page 39: iOS 메모리관리

ClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 40: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 41: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-methodX-init+alloc

Page 42: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 43: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 44: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 45: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 46: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 47: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 48: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

[obj methodX];

super

-init+alloc

Page 49: iOS 메모리관리

NSObjectClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

-init+alloc

Page 50: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

-init+alloc

Page 51: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

+alloc-init+alloc

Page 52: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

+alloc

NSNumber의 Instance

-init -init+alloc

Page 53: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

+alloc

NSNumber의 Instancenum

-init -init+alloc

Page 54: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

+alloc

NSNumber의 Instancenum

isa

-init -init+alloc

Page 55: iOS 메모리관리

NSObject NSNumberClassAClassB

ClassC의 Instance

obj isa

Stack Heap

Code

ClassC

-methodC

super-methodBsuper

-methodA

super

NSNumber *num=[[NSNumber alloc] init];

+alloc

NSNumber의 Instancenum

isa

super

-init -init+alloc

Page 56: iOS 메모리관리

메모리 관리란?

Page 57: iOS 메모리관리

메모리 관리란?

Page 58: iOS 메모리관리

메모리 관리란?Heap

Page 59: iOS 메모리관리

메모리 관리란?Heap

object

Page 60: iOS 메모리관리

메모리 관리란?Heap

object

object

Page 61: iOS 메모리관리

메모리 관리란?Heap

object

object

object

Page 62: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

Page 63: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

Page 64: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

object

Page 65: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

Page 66: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

object

Page 67: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

object

object

Page 68: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

object

object object

Page 69: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

object

object

Page 70: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

objectobject

object

Page 71: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

object

object

Page 72: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

object

Page 73: iOS 메모리관리

메모리 관리란?Heap

object

object

objectobject

object

Page 74: iOS 메모리관리

메모리 관리 방식명시적해제 가비지콜렉터 레퍼런스����������� ������������������  카운팅

방식프로그래머가����������� ������������������  객체를����������� ������������������  생성해서����������� ������������������  사용하다����������� ������������������  필요가����������� ������������������  없을때����������� ������������������  명시적으로����������� ������������������  해제

가비지����������� ������������������  콜렉터가����������� ������������������  수시로����������� ������������������  실행되어서����������� ������������������  필요없는����������� ������������������  객체

들을����������� ������������������  해제

레퍼런스(리테인)카운트에����������� ������������������  의해����������� ������������������  객체를����������� ������������������  해제

특징전적으로����������� ������������������  프로그래머에����������� ������������������  

의해����������� ������������������  관리시스템부하없슴����������� ������������������  

프로그래머가����������� ������������������  관리안함시스템부하

프로그래머가����������� ������������������  오너쉽정책에����������� ������������������  의거해서����������� ������������������  관리시스템부하없슴

언어C++Delphi

JavaC#

Objective-C

Page 75: iOS 메모리관리

Reference Count Systemint main (int argc, const char * argv[]) { NSNumber *num = [[NSNumber alloc] init];NSNumber *num1 = [num retain];NSNumber *num2 = num;[num release];[num1 release];

return 0;}

Page 76: iOS 메모리관리
Page 77: iOS 메모리관리

Reference Count SystemHeapstack

Page 78: iOS 메모리관리

Heapstack

NSNumber *num = [[NSNumber alloc] init];

Page 79: iOS 메모리관리

Heapstack

NSNumber의객체

NSNumber *num = [[NSNumber alloc] init];

Page 80: iOS 메모리관리

Heapstack

numNSNumber의객체

NSNumber *num = [[NSNumber alloc] init];

Page 81: iOS 메모리관리

Heapstack

numNSNumber의객체

NSNumber *num = [[NSNumber alloc] init];

Page 82: iOS 메모리관리

Heapstack

numNSNumber의객체

= 1

NSNumber *num = [[NSNumber alloc] init];

retainCount

Page 83: iOS 메모리관리

Heapstack

NSNumber *num1 = [num retain];

numNSNumber의객체

= 1retainCount

Page 84: iOS 메모리관리

Heapstack

NSNumber *num1 = [num retain];

numNSNumber의객체

= 1

num1

retainCount

Page 85: iOS 메모리관리

Heapstack

NSNumber *num1 = [num retain];

numNSNumber의객체

= 1

num1

retainCount

Page 86: iOS 메모리관리

Heapstack

NSNumber *num1 = [num retain];

numNSNumber의객체

num1

+ 1retainCount

Page 87: iOS 메모리관리

Heapstack

NSNumber *num1 = [num retain];

numNSNumber의객체

num1

= 2retainCount

Page 88: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

= 2retainCount

NSNumber *num2 = num;

Page 89: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

= 2retainCount

NSNumber *num2 = num;

num2

Page 90: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

= 2

[num release];

retainCount

num2

Page 91: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

- 1

[num release];

retainCount

num2

Page 92: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

= 1

[num release];

retainCount

num2

Page 93: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

= 1

[num1 release];

retainCount

num2

Page 94: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

- 1

[num1 release];

retainCount

num2

Page 95: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

[num1 release];

= 0retainCount

num2

Page 96: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

[num1 release];

= 0

dealloc

retainCount

num2

Page 97: iOS 메모리관리

Heapstack

numNSNumber의객체

num1

[num1 release];

= 0retainCount

num2

Page 98: iOS 메모리관리

Heapstack

num

num1

[num1 release];

num2

Page 99: iOS 메모리관리

Reference Count System- (id)init

- (id)retain

- (oneway void)release

- (id)autorelease

- (id)copy...

Page 100: iOS 메모리관리

Reference Count System- (id)init

- (id)retain

- (oneway void)release

Page 101: iOS 메모리관리

Reference Count System- (id)init

- (id)retain

- (oneway void)release

{ . . .

retrainCount=1; .

}

Page 102: iOS 메모리관리

Reference Count System- (id)init

- (id)retain

- (oneway void)release

{ . . .

retrainCount=1; .

}

{ retrainCount+=1; return self;}

Page 103: iOS 메모리관리

Reference Count System- (id)init

- (id)retain

- (oneway void)release

{ . . .

retrainCount=1; .

}

{ retrainCount+=1; return self;}

{ retrainCount-=1; if (retrainCount==0) [self dealloc];}

Page 104: iOS 메모리관리

잘못된 메모리 관리int main (int argc, const char * argv[]) { NSNumber *var1 = [[NSNumber alloc] init];NSNumber *var2 = [[NSNumber alloc] init];NSNumber *var3 = [[NSNumber alloc] init];NSNumber *var4 = [[NSNumber alloc] init];

var2 = [[NSNumber alloc] init];[var3 release]; [var3 isEqualToNumber: var1];

return 0;}

Page 105: iOS 메모리관리

잘못된����������� ������������������  메모리관리

Page 106: iOS 메모리관리

잘못된����������� ������������������  메모리관리Heapstack

Page 107: iOS 메모리관리

Heapstack

NSNumber *var1 = [[NSNumber alloc] init];

Page 108: iOS 메모리관리

Heapstack

object1var1

NSNumber *var1 = [[NSNumber alloc] init];

Page 109: iOS 메모리관리

Heapstack

object1var1

object2var2

NSNumber *var2 = [[NSNumber alloc] init];

Page 110: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

NSNumber *var3 = [[NSNumber alloc] init];

Page 111: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

NSNumber *var4 = [[NSNumber alloc] init];

Page 112: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

var2 = [[NSNumber alloc] init];

Page 113: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

object5

var2 = [[NSNumber alloc] init];

Page 114: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

object5

var2 = [[NSNumber alloc] init];

Page 115: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

object5

var2 = [[NSNumber alloc] init];

memoryleak

Page 116: iOS 메모리관리

Heapstack

object1var1

object2var2

object3var3

object4

var4

object5

[var3 release];

memoryleak

Page 117: iOS 메모리관리

Heapstack

object1var1

object2var2

var3

object4

var4

object5

[var3 release];

memoryleak

Page 118: iOS 메모리관리

Heapstack

object1var1

object2var2

var3

object4

var4

object5

[var3 isEqualToNumber: var1];

memoryleak

Page 119: iOS 메모리관리

Heapstack

object1var1

object2var2

var3

object4

var4

object5

[var3 isEqualToNumber: var1];

memoryleak

danglingpointer

Page 120: iOS 메모리관리

Ownership Policy

alloc����������� ������������������  을����������� ������������������  사용한����������� ������������������  인스턴스����������� ������������������  생성

copy를����������� ������������������  사용한����������� ������������������  인스턴스����������� ������������������  복사

retain을����������� ������������������  사용한����������� ������������������  보존

자기����������� ������������������  몫의����������� ������������������  retainCount����������� ������������������  ‘1’을����������� ������������������  가지는����������� ������������������  것

인스턴스����������� ������������������  객체의����������� ������������������  오너만이����������� ������������������  그����������� ������������������  인스턴스의����������� ������������������  해제에����������� ������������������  대해서����������� ������������������  책임을����������� ������������������  진다.

-����������� ������������������  오너가����������� ������������������  되는����������� ������������������  방법

Page 121: iOS 메모리관리

Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = str;....[str1 release];[str setString:@"나는 주인이다"]; // X

Page 122: iOS 메모리관리

Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = str;....[str1 release];[str setString:@"나는 주인이다"]; // X

NSString * str = [[NSString alloc] init];NSString * str1 = [str retain];....

[str setString:@"나는 주인이다"]; // O[str release];

Page 123: iOS 메모리관리

Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = [str retain];....[str1 release];[str setString:@"나는 주인이다"];[str release];

Page 124: iOS 메모리관리

Ownership Policy

NSString * str = [[NSString alloc] init];NSString * str1 = str;....[str setString:@"나는 주인이다"];[str release];

NSString * str = [[NSString alloc] init];NSString * str1 = [str retain];....[str1 release];[str setString:@"나는 주인이다"];[str release];

Page 125: iOS 메모리관리

Autorelease Pools

Page 126: iOS 메모리관리

Autorelease Pools

Page 127: iOS 메모리관리

Autorelease PoolsNSAutoreleasePool * pool =

[[NSAutoreleasePool alloc] init];NSString *var1 = [[NSString alloc] init];NSString *var2 = [[NSString alloc] init];NSString *var3 = [[NSString alloc] init];[var1 autorelease]; [var2 autorelease];[var3 autorelease];[pool release];

Page 128: iOS 메모리관리

Autorelease PoolsHeapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

object2

object3

pool

Page 129: iOS 메모리관리

Autorelease PoolsHeapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

object2

object3

pool

Page 130: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

object2

object3

pool

[var1 autorelease];

Page 131: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

[var1 autorelease];

Page 132: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

[var1 autorelease];

Page 133: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

[var2 autorelease];

Page 134: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

[var2 autorelease];

Page 135: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

[var2 autorelease];

Page 136: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

[var3 autorelease];

Page 137: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

[var3 autorelease];

Page 138: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

[var3 autorelease];

Page 139: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

[pool release];

Page 140: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

release

[pool release];

Page 141: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

release

release

[pool release];

Page 142: iOS 메모리관리

Heapstack

object1var1

var2

var3

NSAutoreleasePool의 객체

autorelease

object2

object3

pool

autorelease

autorelease

release

release

release

[pool release];

Page 143: iOS 메모리관리

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];

[var1 autorelease];

NSAutoreleasePool * pool2 = [[NSAutoreleasePool alloc] init];[var2 autorelease];

NSAutoreleasePool * pool3 = [[NSAutoreleasePool alloc] init];[var3 autorelease];[pool3 release];[pool2 release];[pool1 release];

Autorelease Pools 중첩사용

Page 144: iOS 메모리관리

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];

[var1 autorelease];

NSAutoreleasePool * pool2 = [[NSAutoreleasePool alloc] init];[var2 autorelease];

NSAutoreleasePool * pool3 = [[NSAutoreleasePool alloc] init];[var3 autorelease];[pool3 release];[pool2 release];[pool1 release];

Autorelease Pools 중첩사용

Page 145: iOS 메모리관리

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];

[var1 autorelease];

NSAutoreleasePool * pool2 = [[NSAutoreleasePool alloc] init];[var2 autorelease];

NSAutoreleasePool * pool3 = [[NSAutoreleasePool alloc] init];[var3 autorelease];[pool3 release];[pool2 release];[pool1 release];

Autorelease Pools 중첩사용

Page 146: iOS 메모리관리

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];

[var1 autorelease];

NSAutoreleasePool * pool2 = [[NSAutoreleasePool alloc] init];[var2 autorelease];

NSAutoreleasePool * pool3 = [[NSAutoreleasePool alloc] init];[var3 autorelease];[pool3 release];[pool2 release];[pool1 release];

Autorelease Pools 중첩사용

Page 147: iOS 메모리관리

Convenience Constructor객체명으로 시작되는 생성자[NSString string.......][NSArray array.........][NSNumber number.......][NSData data...........] . .

편리한 생성자들은 autorelease 객체를 반환 하므로 계속 사용하려면 retain 메세지를 보내 소유권을 획득해야한다.

Page 148: iOS 메모리관리

Object Copy- (id)copyWithZone:(NSZone *)zone {

BlueBird *newBird = [[[self class] alloc] init];

newBird.flyAnimate = [flyAnimate copy];

newBird.sitAnimate = [sitAnimate copy];

newBird.tailAnimate =[tailAnimate copy];

newBird.flyExploAnimate = [flyExploAnimate copy];

newBird.sitExploAnimate = [sitExploAnimate copy];

return newBird;

}

Page 149: iOS 메모리관리

Object CopyNSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

Page 150: iOS 메모리관리

Object Copy

Heapstack

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

Page 151: iOS 메모리관리

Object Copy

Heapstack

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

Page 152: iOS 메모리관리

Object Copy

Heapstack

str object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

Page 153: iOS 메모리관리

Object Copy

Heapstack

str object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount =1

Page 154: iOS 메모리관리

Object Copy

Heapstack

str

str1

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount =2

Page 155: iOS 메모리관리

Object Copy

Heapstack

str

str1

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount object2

=2

Page 156: iOS 메모리관리

Object Copy

Heapstack

str

str1

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount object2

str2

=2

Page 157: iOS 메모리관리

Object Copy

Heapstack

str

str1

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount object2

str2

=2

Page 158: iOS 메모리관리

Object Copy

Heapstack

str

str1

object1

NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];

retainCount object2

str2

=2

retainCount =1

Page 159: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

Page 160: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

Page 161: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

Page 162: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

ShallowCopy

Page 163: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

var3

object3

NSString *str

ShallowCopy

Page 164: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

var3

object3

NSString *str

ShallowCopy

Page 165: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

var3

object3 obj2

NSString *str

ShallowCopy

Page 166: iOS 메모리관리

Deep VS Shallow CopiesHeapstack

var1 object1 obj1

NSString *str

var2

object2

NSString *str

var3

object3 obj2

NSString *str

ShallowCopy

DeepCopy

Page 167: iOS 메모리관리

Accessor Methods@interface ClassA : NSObject { int score;}- (void)setScore:(int)val; //setter- (int)score; //getter@end

@implementation ClassA- (void)setScore:(int)val { score = val;}- (int)score { return score;}@end

Page 168: iOS 메모리관리

Accessor Methods

@implementation ClassA- (void)setScore:(int)val { score = val;}- (int)score { return score;}@end

@interface ClassA : NSObject { int score;}@property int score;//- (void)setScore:(int) val; //setter//- (int)score; //getter@end

Page 169: iOS 메모리관리

Accessor Methods@interface ClassA : NSObject { int score;}@property int score;//- (void)setScore:(int) val; //setter//- (int)score; //getter@end

@implementation ClassA@synthesize score=score;//- (void)setScore:(int) val {//score = val;//}//- (int)score {//return score;//}@end

Page 170: iOS 메모리관리

Accessor Methods@interface ClassA : NSObject { int score;}@property int score;//- (void)setScore:(int) val; //setter//- (int)score; //getter@end

@implementation ClassA@synthesize score;//- (void)setScore:(int) val {//score = val;//}//- (int)score {//return score;//}@end

Page 171: iOS 메모리관리

Accessor Methods// setter를 사용하게 되면 다음과 같은 validation(유효성) 검사가 가능하다// 이를 통해 더욱더 안전한 데이터 사용이 가능하다

@implementation ClassA...- (void)setScore:(int)val {

if( val < 0 ) score = 0;

else score = val;

}- (int)score { return score;}@end

Page 172: iOS 메모리관리

Accessor Methods

Page 173: iOS 메모리관리

Accessor Methodsint main (int argc, const char * argv[]) {

ClassA *classA = [[ClassA alloc] init]; [classA setScore:999]; NSLog(@"Num:%i", [classA score]); classA.score = 777;// [classA setScore:777]; 호출 NSLog(@"Num:%i", classA.score);

return 0;}

Page 174: iOS 메모리관리

Property 속성지정분류 옵션 설명

메소드지정getter=methodA getter를 명시적으로 지정

메소드지정setter=methodB setter를 명시적으로 지정

읽기쓰기속성readonly 읽기전용, getter만 생성

읽기쓰기속성readwrite(*) 읽기쓰기

스레드 처리atomic(*) 멀티쓰레드시 메쏘드 Lock

스레드 처리nonatomic Non-atomic

할당방식

assign(*) 주소만 할당

할당방식 retain 객체를 retain해서 할당할당방식

copy 객체를 복사해서 할당

Page 175: iOS 메모리관리

Property 속성지정@property (getter=score, setter=setScore:) int score;

@property (readonly, getter=score) int score;

@property (readonly, nonatomic) int score;

@property (nonatomic, retain) NSNumber score;

@property (nonatomic, copy) NSNumber score;

@property (nonatomic, assign) NSNumber score;

Page 176: iOS 메모리관리

Property 속성지정@property (getter=score, setter=setScore:) int score;

@synthesize score

// 위 문장은 아래 코드를 생성한다. setScore, score 메소드를 생성한다

Page 177: iOS 메모리관리

Property 속성지정@property (getter=score, setter=setScore:) int score;

- (void)setScore:(int) val { score = val;}

- (int)score { return score;}

@synthesize score

// 위 문장은 아래 코드를 생성한다. setScore, score 메소드를 생성한다

Page 178: iOS 메모리관리

Property 속성지정

@property (readonly, getter=score) int score;

@synthesize score

// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다

Page 179: iOS 메모리관리

Property 속성지정

@property (readonly, getter=score) int score;

- (int)score { return score;}

@synthesize score

// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다

Page 180: iOS 메모리관리

Property 속성지정

@property (readonly, getter=scoreValue) int score;

@synthesize score

// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다// getter 메소드 scoreValue로 지정되어 있다

Page 181: iOS 메모리관리

Property 속성지정

@property (readonly, getter=scoreValue) int score;

- (int)scoreValue { return score;}

@synthesize score

// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다// getter 메소드 scoreValue로 지정되어 있다

Page 182: iOS 메모리관리

Property 속성지정@property (readonly) int score;

@synthesize score

// 위 문장은 아래 코드를 생성한다.// 디폴트 getter 메소드 명은 속성값의 이름인 score이다.// readonly 속성에 의해 setScore메소드는 생성하지 않는다.

Page 183: iOS 메모리관리

Property 속성지정@property (readonly) int score;

- (int)score { return score;}

@synthesize score

// 위 문장은 아래 코드를 생성한다.// 디폴트 getter 메소드 명은 속성값의 이름인 score이다.// readonly 속성에 의해 setScore메소드는 생성하지 않는다.

Page 184: iOS 메모리관리

Property 속성지정@property (getter=score, setter=setScore:) int score;

@property (readonly, getter=score) int score;

@property (readonly, nonatomic) int score;

@property (nonatomic, retain) NSNumber *score;

@property (nonatomic, copy) NSNumber *score;

@property (nonatomic, assign) NSNumber *score;

Page 185: iOS 메모리관리

Accessor Methods@property (retain) NSString *str;

@property (copy) NSString *str;

@property (assign) NSString *str;

Page 186: iOS 메모리관리

Accessor Methods@property (retain) NSString *str;

@property (copy) NSString *str;

@property (assign) NSString *str;

- (void)setStr:(NSString *)newStr { if (str != newStr) { [str release]; str = [newStr retain]; }}

Page 187: iOS 메모리관리

Accessor Methods@property (retain) NSString *str;

@property (copy) NSString *str;

@property (assign) NSString *str;

- (void)setStr:(NSString *)newStr { if (str != newStr) { [str release]; str = [newStr retain]; }}

- (void)setStr:(NSString *)newStr { if (str != newStr) { [str release]; str = [newStr copy]; }}

Page 188: iOS 메모리관리

Accessor Methods@property (retain) NSString *str;

@property (copy) NSString *str;

@property (assign) NSString *str;

- (void)setStr:(NSString *)newStr { if (str != newStr) { [str release]; str = [newStr retain]; }}

- (void)setStr:(NSString *)newStr { if (str != newStr) { [str release]; str = [newStr copy]; }}

- (void)setStr:(NSString *)newStr { str = newStr;}

Page 189: iOS 메모리관리

Property 속성지정

@property (nonatomic, retain) UIButton *scoreButton;// nonatomic한 속성을 가진 scoreButton 메소드 생성// atomic한 객체는 안정성을 보장해야 하므로 임의의 스레드가// scoreButton 값을 사용하는 중에는 다른 스레드가 이 값에 대한 setter를// 호출하지 못하도록 한다.

Page 190: iOS 메모리관리

Property 속성지정

@property (nonatomic, retain) UIButton *scoreButton;// nonatomic한 속성을 가진 scoreButton 메소드 생성// atomic한 객체는 안정성을 보장해야 하므로 임의의 스레드가// scoreButton 값을 사용하는 중에는 다른 스레드가 이 값에 대한 setter를// 호출하지 못하도록 한다. - (void)setScoreButton:(UIButton *)newButton { if ( scoreButton != newButton ) { [scoreButton release]; scoreButton = [newButton retain]; }}-(UIButton *)scoreButton{ return scoreButton;}

Page 191: iOS 메모리관리

nonatomic vs atomic

쓰레드- 어떠한 프로그램의 프로세스내에서 실행되는 흐름의 단위를 말함- 한 프로그램 내에는 여러개의 쓰레드가 동작할 수 있음- 하나의 값을 여러 쓰레드가 동시에 접근하여 변경하게 되면 문제가 발생

Page 192: iOS 메모리관리

nonatomic vs atomicatomic- setter/getter는 다른 쓰레드 setter 메소드를 행하는 중에는접근할 수 없도록 한다.(read-write safety)- atomic한 접근을 보장하기 위해서는 수행 속도면에서 손해를 보게된다

nonatomic- nonatomic 속성은 atomic한 기능을 보장하지 않는다- 대신 수행속도가 빠르다

쓰레드 안정성(thread safety)- atomic은 쓰레드 안정성을 보장해 주지는 않는다- 즉 setter나 getter가 작동하는 중에 release가 이루어지게 되면crash가 발생하는데 이러한 부분까지는 atomic한 속성으로 보장해 주지않는다

Page 193: iOS 메모리관리

Case which OftenCause Confusion

Page 194: iOS 메모리관리

Using Collections

NSMutableArray *array = <#Get a mutable array#>;

NSUInteger i; // ... for (i = 0; i < 10; i++) { NSNumber *convenienceNumber =

[NSNumber numberWithInteger:i]; [array addObject:convenienceNumber]; }

Page 195: iOS 메모리관리

Using Collections

NSMutableArray *array = <#Get a mutable array#>;

NSUInteger i; // ... for (i = 0; i < 10; i++) { NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger:i]; [array addObject:allocedNumber]; [allocedNumber release];

}

Page 196: iOS 메모리관리

Returning Object from Method

Wrong Case- (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName] release]; return string;}

- (NSString *)fullName { NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; return string;}

Page 197: iOS 메모리관리

Returning Object from Method

Correct Case- (NSString *)fullName { NSString *string = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; return string;}

- (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,lastName] autorelease]; return string;}

Page 198: iOS 메모리관리

Automatic Reference Counting

ARC- 컴파일러 수준의 기능으로 객체의 참조 횟수를 추적하는 일을 프로그래머가 하지않고 컴파일러가 대신 수행하는 형태로 메모리 관리기능을 보강한 것이다.- Objective-C 언어자체의 기능은 아님- 2011년 Mac OS X Lion과 iOS 5 운영체제에서 도입되었다- Xcode 4.2부터 사용가능하다

Page 199: iOS 메모리관리

ARC 규칙

ARC 사용시의 규칙은 다음과 같다- retain, release, retainCount, autorelease, dealloc을 프로그래머가 직접 호출할 수 없다- id 형이나 void * 형을 직접 형변화시킬 수 없다- NSAutoreleasePool 객체를 사용할 수 없다- NSAllocateObject 와 NSDeallocateObject 함수를 호출할 수 없다- C 구조체내의 객체 포인트를 사용할 수 없다- 메모리 존(NSZone)을 사용할 수 없다

Page 200: iOS 메모리관리

ARC 컴파일 옵션설정

ARC 사용시 컴파일 옵션 설정- Project 시작시 Use Automatic Reference Counting을 체크

Page 201: iOS 메모리관리

ARC 자동 변환기능ARC를 사용하지 않는 코드를 자동 변환하는 기능

Page 202: iOS 메모리관리

ARC 컴파일 플래그

Target - Build Setting에서 - Objective-C Automatic Reference Counting을 YES로 설정

Page 203: iOS 메모리관리

ARC 컴파일 플래그

Build Phase - Compile Sources에서 - -fobjc-arc 컴파일러 플래그 설정으로 arc 기능을 적용시킴- -fno-objc-arc 로 arc 기능을 적용시키지 않음

Page 204: iOS 메모리관리

프로퍼티 관련 지시어

ARC 사용전@property (nonatomic, retain) NSString *fname;@property (nonatomic, assign) NSString *lname;@property (nonatomic, assign) NSInteger age;

ARC 사용후// retain 카운터를 유지시키는 대신 strong 참조로@property (nonatomic, strong) NSString *fname;// assign 속성은 weak 참조 속성으로 바뀐다@property (nonatomic, weak) NSString *lname;// arc 적용의 대상이 아님(참조 카운터를 유지하지 않음)@property (nonatomic, assign) NSInteger age;

Page 205: iOS 메모리관리

객체간의 참조

ARC 기능-객체간의 참조 카운터를 자동으로 관리객체간의 참조- 1:1 참조 또는 1:n 참조가 가능strong 참조- 한 객체가 다른 객체를 strong 참조로 참조하고 있는 경우, 참조되고 있는 객체가 소멸되지 않는다.weak 참조- 한 객체가 다른 객체를 weak 참조로 참조하고 있는 경우, 참조되고 있는 객체의 생존은 보장되지 않는다

Page 206: iOS 메모리관리

Retain Cycle

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

Document *ref_doc = [[Document alloc] init];

Page *ref_page = [[NSString alloc] init];

ref_doc.page = [ref_page retain];ref_page.document = [ref_doc retain];

[ref_doc release];// 상호참조로 인해 객체를 소멸시킬 수 없다

Page 207: iOS 메모리관리

Retain Cycle

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

Page 208: iOS 메모리관리

Weak Reference

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

Page 209: iOS 메모리관리

Weak Reference

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

Document *ref_doc = [[Document alloc] init];

Page *ref_page = [[NSString alloc] init];

ref_doc.page = [ref_page retain];ref_page.document = ref_doc;

[ref_doc release];

Page 210: iOS 메모리관리

Weak Reference(약한 참조)

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

Page 211: iOS 메모리관리

Weak Reference(약한 참조)

��)��$ �.�"�(

�$ (%#� (�)*�)�%$(� ),% %� ��)( #�. ��+� �.�"���" '���'�$��( )��) �(� ���� %� ��) �%$)��$( �$ �$()�$�� +�'���"�)��) '���'( )% )�� %)��' %� ��)� �%' �-�#&"�� �%$(���' � )�-) &'%�'�# ,�)� )�� %� ��) '�"�)�%$(��&( (�%,$ �$���*'� ���&�������� ��� �%�*#�$) %� ��) �'��)�( � ���� %� ��) �%' ���� &��� �$ )�� �%�*#�$)� ��� ����%� ��) ��( �$ �$()�$�� +�'���"� )��) !��&( )'��! %� ,���� �%�*#�$) �) �( �$� �� )�� �%�*#�$) %� ��) '�)��$��)�� ���� %� ��) �$� )�� ���� %� ��) '�)��$�� )�� �%�*#�$) %� ��)� $��)��' %� ��) ,%*"� �+�' �� '�"��(������ �%�*#�$)1( '���'�$�� �%*$) ��$$%) ���%#� � *$)�" )�� ���� %� ��) �( '�"��(��� �$� )�� ���� %� ��),%$1) �� '�"��(�� *$)�" )�� �%�*#�$) %� ��) �( ���""%��)���

����� � $ �""*()'�)�%$ %� '�)��$ �.�"�(

textparent

parentparagraph

Paragraph

Page

page

Document

retaindon’tretain

don’tretain

retain

��� (%"*)�%$ )% )�� &'%�"�# %� '�)��$ �.�"�( �( )��) )�� /&�'�$)0 %� ��) (�%*"� '�)��$ �)( /���"�'�$�0 �*) )��))�� ���"�'�$ (�%*"� $%) '�)��$ )���' &�'�$)(� �%� �$ ���*'� ���&������� )�� �%�*#�$) %� ��) '�)��$( �)( &���%� ��)( �*) )�� &��� %� ��) �%�( $%) '�)��$ )�� �%�*#�$) %� ��)� ��� ���"�1( '���'�$�� )% �)( &�'�$) �( �$�-�#&"� %� � ,��! '���'�$��� ,���� �( ��(�'���� #%'� �*"". �$ /���! ����'�$��( )% �� ��)(0��&��������

���! ����'�$��( )% �� ��)(

��)��$�$� �$ %� ��) �'��)�( � /()'%$�0 '���'�$�� )% )��) %� ��)� $ %� ��) ��$$%) �� ���""%��)�� *$)�" �"" %��)( ()'%$� '���'�$��( �'� '�"��(��� $ %� ��)1( "���)�#� �( )��'��. ��)�'#�$�� �. )�� %,$�'( %� �)( ()'%$�'���'�$��(� �$ (%#� ��(�(� )��( ����+�%' #�. $%) �� ��(�'��� �%* #�. ,�$) )% ��+� � '���'�$�� )% �$ %� ��),�)�%*) &'�+�$)�$� )�� %� ��) �'%# ���""%��)�$� �)(�"�� �%' )��(� ��(�(� .%* ��$ %�)��$ � /,��!0 '���'�$��� ,��! '���'�$�� �( �'��)�� �. ()%'�$� � &%�$)�' )% �$ %� ��) ,�)�%*) '�)��$�$� )�� %� ��)�

��)��$ �.�"�( ��������������� ��������������������������������������� �

�� ��) �,$�'(��& �$� ��(&%(�"

strong 참조의 경우 객체들이 상호참조를 할 경우순환고리로 인해 이들을 소멸시킬 수 없다이 때문에 memory 누수가 발생한다weak 참조의 경우 strong 참조와는 달리 참조되고있는 객체의 생존을 보장하지는 않는다

Page 212: iOS 메모리관리

Strong Reference(강한 참조)

A

B

C

D

E

Page 213: iOS 메모리관리

Strong Reference(강한 참조)

- A가 B를 참조하지 않게 되면

A

B

C

D

E

Page 214: iOS 메모리관리

Strong Reference(강한 참조)

A

B

C

D

E

Page 215: iOS 메모리관리

Strong Reference(강한 참조)

- B가 소멸되어야 하지만 B를 E가 참조하고 있고, E는 D가, D는 C가, C는 B가 참조하고 있어서 B,C,D,E는 소멸되지 않고 참조되지도 않는 메모리 누수(leak) 객체가 됨

A

B

C

D

E

Page 216: iOS 메모리관리

Weak Reference(약한 참조)

A

B

C

D

E

Page 217: iOS 메모리관리

Weak Reference(약한 참조)

- E가 B를 참조하되 약한 참조를 할 경우

A

B

C

D

E

Page 218: iOS 메모리관리

Weak Reference(약한 참조)

A

B

C

D

E

Page 219: iOS 메모리관리

Weak Reference(약한 참조)

- A가 B를 참조하지 않게 되면

A

B

C

D

E

Page 220: iOS 메모리관리

Weak Reference(약한 참조)

A

B

C

D

E

Page 221: iOS 메모리관리

Weak Reference(약한 참조)

- B를 참조하는 E가 약한 참조이므로- B는 생존을 보장받지 못한다. - 이 때문에 B는 소멸가능한 객체가 되고

A

B

C

D

E

Page 222: iOS 메모리관리

Weak Reference(약한 참조)

A

C

D

E

Page 223: iOS 메모리관리

Weak Reference(약한 참조)

- B가 소멸되면 C는 참조하는 객체가 없으므로 소멸된다

A

C

D

E

Page 224: iOS 메모리관리

Weak Reference(약한 참조)

A

D

E

Page 225: iOS 메모리관리

Weak Reference(약한 참조)

- C가 소멸되면 D는 참조하는 객체가 없으므로 소멸된다

A

D

E

Page 226: iOS 메모리관리

Weak Reference(약한 참조)

A

E

Page 227: iOS 메모리관리

Weak Reference(약한 참조)

- D가 소멸되면 E는 참조하는 객체가 없으므로 소멸된다

A

E

Page 228: iOS 메모리관리

Weak Reference(약한 참조)

A

Page 229: iOS 메모리관리

Weak Reference(약한 참조)

- 상호참조 객체들이 있더라도 메모리 누수가 발생하지 않는다

A

Page 230: iOS 메모리관리

Thank YOU!