iOS 메모리관리

5,118 views
4,966 views

Published on

이 자료는 이영록강사님이 2011년 iOS 개발자 포럼에서 발표한 내용을 약간 개선하고 정리한 자료입니다.

iOS의 메모리관리 기법은 retain count라고 하는 독특하면서도 효율적인 방법을 사용하며 최근에 발표된 Xcode에서는 Automatic Reference Counting(ARC) 기법을 통해 release를 사용하에 객체를 소거하는 불편함을 많이 개선하였습니다.

본 자료에서는 이러한 점에 대한 비교적 상세한 설명을 담고 있습니다.

0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,118
On SlideShare
0
From Embeds
0
Number of Embeds
1,866
Actions
Shares
0
Downloads
44
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

iOS 메모리관리

  1. 1. iOS MemoryManagement이영록
  2. 2. 실행시 메모리 구조
  3. 3. 실행시 메모리 구조StackHeapDataCode(Text)
  4. 4. 실행시 메모리 구조StackHeapDataCode(Text) 프로그램코드가
  5. 5.  저장
  6. 6. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  7. 7.  정적변수가
  8. 8.  저장프로그램코드가
  9. 9.  저장
  10. 10. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  11. 11.  정적변수가
  12. 12.  저장동적할당을
  13. 13.  위한
  14. 14.  공간프로그램코드가
  15. 15.  저장
  16. 16. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  17. 17.  정적변수가
  18. 18.  저장동적할당을
  19. 19.  위한
  20. 20.  공간지역변수와
  21. 21.  매개변수가
  22. 22.  저장프로그램코드가
  23. 23.  저장
  24. 24. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  25. 25.  정적변수가
  26. 26.  저장동적할당을
  27. 27.  위한
  28. 28.  공간지역변수와
  29. 29.  매개변수가
  30. 30.  저장프로그램코드가
  31. 31.  저장}메모리
  32. 32.  사용량
  33. 33.  변동없음프로그램
  34. 34.  종료시
  35. 35.  해제
  36. 36. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  37. 37.  정적변수가
  38. 38.  저장동적할당을
  39. 39.  위한
  40. 40.  공간지역변수와
  41. 41.  매개변수가
  42. 42.  저장프로그램코드가
  43. 43.  저장}메모리
  44. 44.  사용량
  45. 45.  변동없음프로그램
  46. 46.  종료시
  47. 47.  해제-객체가
  48. 48.  생성되는
  49. 49.  공간사용량이
  50. 50.  변동메모리관리의
  51. 51.  대상영역
  52. 52. 실행시 메모리 구조StackHeapDataCode(Text)전역변수와
  53. 53.  정적변수가
  54. 54.  저장동적할당을
  55. 55.  위한
  56. 56.  공간지역변수와
  57. 57.  매개변수가
  58. 58.  저장프로그램코드가
  59. 59.  저장}메모리
  60. 60.  사용량
  61. 61.  변동없음프로그램
  62. 62.  종료시
  63. 63.  해제-객체가
  64. 64.  생성되는
  65. 65.  공간사용량이
  66. 66.  변동메모리관리의
  67. 67.  대상영역사용량이
  68. 68.  계속해서
  69. 69.  변경OS가
  70. 70.  관리-
  71. 71. 메모리-Code 영역프로그램의
  72. 72.  명령문들-
  73. 73.  이
  74. 74.  명령문에
  75. 75.  의해
  76. 76.  프로그램은
  77. 77.  작동한다
  78. 78. 메모리-Data 영역전역변수• 프로그램 전역에서 사용가능한변수정적변수• 실행중에 항상 일정한 메모리 공간에 유지됨• 블럭을 벗어나도 자동으로 제거되지 않음
  79. 79. 메모리-Heap 영역동적할당 변수• 프로그램 실행중에 Heap 영역으로부터 필요한 만큼 메모리를 할당받는다.• 사용이 완료되면 시스템에 반납하여야 한다• C언어에서는 malloc() 함수에 의해 할당• C++ 언어에서는 new 키워드에 의해 할당• Objective-C 언어에서는 alloc 메소드에 의해 할당장점• 효율적인 메모리 관리가 가능하다단점• 메모리 관리를 프로그래머가 책임지고 해야한다
  80. 80. 메모리-Stack 영역지역변수• 함수나 블럭안에서 정의되는 변수• 함수가 종료되거나 프로그램이 종료되면 메모리 공간이 해제됨• 함수가 받는 매개 변수나 함수내에서 사용되는 지역변수가 이 Stack 영역에 저장( OS의 관리 )
  81. 81. @interface ClassA : NSObject {}+ (void) imClassMethod- (void) methodA;@end@implementation ClassA+ (void) imClassMethod { NSLog(@I’m Class Method);}- (void) methodA { NSLog(@I’m A);}@end
  82. 82. @interface ClassB : ClassA {}- (void) methodB;@end@implementation ClassB- (void) methodB { NSLog(@I’m B);}@end
  83. 83. @interface ClassC : ClassB {}- (void) methodC;@end@implementation ClassC- (void) methodC { NSLog(@I’m C);}@end
  84. 84. 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;}
  85. 85. Stack HeapCode
  86. 86. ClassC *obj = [[ClassC alloc] init];Stack HeapCode
  87. 87. ClassC *obj = [[ClassC alloc] init];Stack HeapCodeClassC
  88. 88. ClassC *obj = [[ClassC alloc] init];ClassC의 InstanceStack HeapCodeClassC+alloc
  89. 89. ClassC *obj = [[ClassC alloc] init];ClassC의 InstanceStack HeapCodeClassC-init+alloc
  90. 90. ClassC *obj = [[ClassC alloc] init];ClassC의 InstanceobjStack HeapCodeClassC-init+alloc
  91. 91. ClassC *obj = [[ClassC alloc] init];ClassC의 InstanceobjStack HeapCodeClassC-init+alloc
  92. 92. ClassC *obj = [[ClassC alloc] init];ClassC의 Instanceobj isaStack HeapCodeClassC-init+alloc
  93. 93. ClassC *obj = [[ClassC alloc] init];ClassC의 Instanceobj isaStack HeapCodeClassC-init+alloc
  94. 94. ClassC의 Instanceobj isaStack HeapCode[obj methodC];ClassC-init+alloc
  95. 95. ClassC의 Instanceobj isaStack HeapCode[obj methodC];ClassC-methodC-init+alloc
  96. 96. ClassC의 Instanceobj isaStack HeapCodeClassC-methodC[obj methodB];-init+alloc
  97. 97. ClassC의 Instanceobj isaStack HeapCodeClassC-methodC[obj methodB];super-init+alloc
  98. 98. ClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodC[obj methodB];super-init+alloc
  99. 99. ClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodC[obj methodB];super-methodB-init+alloc
  100. 100. ClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodB[obj methodA];-init+alloc
  101. 101. ClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodB[obj methodA];super-init+alloc
  102. 102. ClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodB[obj methodA];super-init+alloc
  103. 103. ClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodB[obj methodA];super-methodA-init+alloc
  104. 104. ClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];-init+alloc
  105. 105. ClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  106. 106. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  107. 107. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-methodX-init+alloc
  108. 108. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  109. 109. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  110. 110. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  111. 111. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  112. 112. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  113. 113. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  114. 114. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodA[obj methodX];super-init+alloc
  115. 115. NSObjectClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];-init+alloc
  116. 116. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];-init+alloc
  117. 117. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];+alloc-init+alloc
  118. 118. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];+allocNSNumber의 Instance-init -init+alloc
  119. 119. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];+allocNSNumber의 Instancenum-init -init+alloc
  120. 120. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];+allocNSNumber의 Instancenumisa-init -init+alloc
  121. 121. NSObject NSNumberClassAClassBClassC의 Instanceobj isaStack HeapCodeClassC-methodCsuper-methodBsuper-methodAsuperNSNumber *num=[[NSNumber alloc] init];+allocNSNumber의 Instancenumisasuper-init -init+alloc
  122. 122. 메모리 관리란?
  123. 123. 메모리 관리란?
  124. 124. 메모리 관리란?Heap
  125. 125. 메모리 관리란?Heapobject
  126. 126. 메모리 관리란?Heapobjectobject
  127. 127. 메모리 관리란?Heapobjectobjectobject
  128. 128. 메모리 관리란?Heapobjectobjectobjectobject
  129. 129. 메모리 관리란?Heapobjectobjectobjectobjectobject
  130. 130. 메모리 관리란?Heapobjectobjectobjectobjectobjectobject
  131. 131. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobject
  132. 132. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobjectobject
  133. 133. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobjectobjectobject
  134. 134. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobjectobjectobjectobject
  135. 135. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobjectobjectobject
  136. 136. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobjectobject
  137. 137. 메모리 관리란?Heapobjectobjectobjectobjectobjectobjectobject
  138. 138. 메모리 관리란?Heapobjectobjectobjectobjectobjectobject
  139. 139. 메모리 관리란?Heapobjectobjectobjectobjectobject
  140. 140. 메모리 관리 방식명시적해제 가비지콜렉터 레퍼런스
  141. 141.  카운팅방식프로그래머가
  142. 142.  객체를
  143. 143.  생성해서
  144. 144.  사용하다
  145. 145.  필요가
  146. 146.  없을때
  147. 147.  명시적으로
  148. 148.  해제가비지
  149. 149.  콜렉터가
  150. 150.  수시로
  151. 151.  실행되어서
  152. 152.  필요없는
  153. 153.  객체들을
  154. 154.  해제레퍼런스(리테인)카운트에
  155. 155.  의해
  156. 156.  객체를
  157. 157.  해제특징전적으로
  158. 158.  프로그래머에
  159. 159.  의해
  160. 160.  관리시스템부하없슴
  161. 161.  프로그래머가
  162. 162.  관리안함시스템부하프로그래머가
  163. 163.  오너쉽정책에
  164. 164.  의거해서
  165. 165.  관리시스템부하없슴언어C++DelphiJavaC#Objective-C
  166. 166. 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;}
  167. 167. Reference Count SystemHeapstack
  168. 168. HeapstackNSNumber *num = [[NSNumber alloc] init];
  169. 169. HeapstackNSNumber의객체NSNumber *num = [[NSNumber alloc] init];
  170. 170. HeapstacknumNSNumber의객체NSNumber *num = [[NSNumber alloc] init];
  171. 171. HeapstacknumNSNumber의객체NSNumber *num = [[NSNumber alloc] init];
  172. 172. HeapstacknumNSNumber의객체= 1NSNumber *num = [[NSNumber alloc] init];retainCount
  173. 173. HeapstackNSNumber *num1 = [num retain];numNSNumber의객체= 1retainCount
  174. 174. HeapstackNSNumber *num1 = [num retain];numNSNumber의객체= 1num1retainCount
  175. 175. HeapstackNSNumber *num1 = [num retain];numNSNumber의객체= 1num1retainCount
  176. 176. HeapstackNSNumber *num1 = [num retain];numNSNumber의객체num1+ 1retainCount
  177. 177. HeapstackNSNumber *num1 = [num retain];numNSNumber의객체num1= 2retainCount
  178. 178. HeapstacknumNSNumber의객체num1= 2retainCountNSNumber *num2 = num;
  179. 179. HeapstacknumNSNumber의객체num1= 2retainCountNSNumber *num2 = num;num2
  180. 180. HeapstacknumNSNumber의객체num1= 2[num release];retainCountnum2
  181. 181. HeapstacknumNSNumber의객체num1- 1[num release];retainCountnum2
  182. 182. HeapstacknumNSNumber의객체num1= 1[num release];retainCountnum2
  183. 183. HeapstacknumNSNumber의객체num1= 1[num1 release];retainCountnum2
  184. 184. HeapstacknumNSNumber의객체num1- 1[num1 release];retainCountnum2
  185. 185. HeapstacknumNSNumber의객체num1[num1 release];= 0retainCountnum2
  186. 186. HeapstacknumNSNumber의객체num1[num1 release];= 0deallocretainCountnum2
  187. 187. HeapstacknumNSNumber의객체num1[num1 release];= 0retainCountnum2
  188. 188. Heapstacknumnum1[num1 release];num2
  189. 189. Reference Count System- (id)init- (id)retain- (oneway void)release- (id)autorelease- (id)copy...
  190. 190. Reference Count System- (id)init- (id)retain- (oneway void)release
  191. 191. Reference Count System- (id)init- (id)retain- (oneway void)release{. . . retrainCount=1; .}
  192. 192. Reference Count System- (id)init- (id)retain- (oneway void)release{. . . retrainCount=1; .}{ retrainCount+=1;return self;}
  193. 193. Reference Count System- (id)init- (id)retain- (oneway void)release{. . . retrainCount=1; .}{ retrainCount+=1;return self;}{ retrainCount-=1; if (retrainCount==0) [self dealloc];}
  194. 194. 잘못된 메모리 관리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;}
  195. 195. 잘못된
  196. 196.  메모리관리
  197. 197. 잘못된
  198. 198.  메모리관리Heapstack
  199. 199. HeapstackNSNumber *var1 = [[NSNumber alloc] init];
  200. 200. Heapstackobject1var1NSNumber *var1 = [[NSNumber alloc] init];
  201. 201. Heapstackobject1var1object2var2NSNumber *var2 = [[NSNumber alloc] init];
  202. 202. Heapstackobject1var1object2var2object3var3NSNumber *var3 = [[NSNumber alloc] init];
  203. 203. Heapstackobject1var1object2var2object3var3object4var4NSNumber *var4 = [[NSNumber alloc] init];
  204. 204. Heapstackobject1var1object2var2object3var3object4var4var2 = [[NSNumber alloc] init];
  205. 205. Heapstackobject1var1object2var2object3var3object4var4object5var2 = [[NSNumber alloc] init];
  206. 206. Heapstackobject1var1object2var2object3var3object4var4object5var2 = [[NSNumber alloc] init];
  207. 207. Heapstackobject1var1object2var2object3var3object4var4object5var2 = [[NSNumber alloc] init];memoryleak
  208. 208. Heapstackobject1var1object2var2object3var3object4var4object5[var3 release];memoryleak
  209. 209. Heapstackobject1var1object2var2var3object4var4object5[var3 release];memoryleak
  210. 210. Heapstackobject1var1object2var2var3object4var4object5[var3 isEqualToNumber: var1];memoryleak
  211. 211. Heapstackobject1var1object2var2var3object4var4object5[var3 isEqualToNumber: var1];memoryleakdanglingpointer
  212. 212. Ownership Policyalloc
  213. 213.  을
  214. 214.  사용한
  215. 215.  인스턴스
  216. 216.  생성copy를
  217. 217.  사용한
  218. 218.  인스턴스
  219. 219.  복사retain을
  220. 220.  사용한
  221. 221.  보존자기
  222. 222.  몫의
  223. 223.  retainCount
  224. 224.  ‘1’을
  225. 225.  가지는
  226. 226.  것인스턴스
  227. 227.  객체의
  228. 228.  오너만이
  229. 229.  그
  230. 230.  인스턴스의
  231. 231.  해제에
  232. 232.  대해서
  233. 233.  책임을
  234. 234.  진다.-
  235. 235.  오너가
  236. 236.  되는
  237. 237.  방법
  238. 238. Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = str;....[str1 release];[str setString:@나는 주인이다]; // X
  239. 239. Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = str;....[str1 release];[str setString:@나는 주인이다]; // XNSString * str = [[NSString alloc] init];NSString * str1 = [str retain];....[str setString:@나는 주인이다]; // O[str release];
  240. 240. Ownership PolicyNSString * str = [[NSString alloc] init];NSString * str1 = [str retain];....[str1 release];[str setString:@나는 주인이다];[str release];
  241. 241. Ownership PolicyNSString * 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];
  242. 242. Autorelease Pools
  243. 243. Autorelease Pools
  244. 244. 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];
  245. 245. Autorelease PoolsHeapstackobject1var1var2var3NSAutoreleasePool의 객체object2object3pool
  246. 246. Autorelease PoolsHeapstackobject1var1var2var3NSAutoreleasePool의 객체object2object3pool
  247. 247. Heapstackobject1var1var2var3NSAutoreleasePool의 객체object2object3pool[var1 autorelease];
  248. 248. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3pool[var1 autorelease];
  249. 249. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3pool[var1 autorelease];
  250. 250. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3pool[var2 autorelease];
  251. 251. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautorelease[var2 autorelease];
  252. 252. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautorelease[var2 autorelease];
  253. 253. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautorelease[var3 autorelease];
  254. 254. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautorelease[var3 autorelease];
  255. 255. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautorelease[var3 autorelease];
  256. 256. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautorelease[pool release];
  257. 257. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautoreleaserelease[pool release];
  258. 258. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautoreleasereleaserelease[pool release];
  259. 259. Heapstackobject1var1var2var3NSAutoreleasePool의 객체autoreleaseobject2object3poolautoreleaseautoreleasereleasereleaserelease[pool release];
  260. 260. 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 중첩사용
  261. 261. 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 중첩사용
  262. 262. 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 중첩사용
  263. 263. 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 중첩사용
  264. 264. Convenience Constructor객체명으로 시작되는 생성자[NSString string.......][NSArray array.........][NSNumber number.......][NSData data...........]..편리한 생성자들은 autorelease 객체를 반환 하므로 계속 사용하려면 retain 메세지를 보내 소유권을 획득해야한다.
  265. 265. 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;}
  266. 266. Object CopyNSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];
  267. 267. Object CopyHeapstackNSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];
  268. 268. Object CopyHeapstackobject1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];
  269. 269. Object CopyHeapstackstrobject1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];
  270. 270. Object CopyHeapstackstrobject1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCount =1
  271. 271. Object CopyHeapstackstrstr1object1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCount =2
  272. 272. Object CopyHeapstackstrstr1object1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCountobject2=2
  273. 273. Object CopyHeapstackstrstr1object1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCountobject2str2=2
  274. 274. Object CopyHeapstackstrstr1object1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCountobject2str2=2
  275. 275. Object CopyHeapstackstrstr1object1NSString *str = [[NSString alloc] init];NSString *str1 = [str retain];NSString *str2 = [str copy];retainCountobject2str2=2retainCount =1
  276. 276. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*str
  277. 277. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*str
  278. 278. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*str
  279. 279. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*strShallowCopy
  280. 280. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*strvar3object3NSString*strShallowCopy
  281. 281. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*strvar3object3NSString*strShallowCopy
  282. 282. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*strvar3object3 obj2NSString*strShallowCopy
  283. 283. Deep VS Shallow CopiesHeapstackvar1 object1 obj1NSString*strvar2object2NSString*strvar3object3 obj2NSString*strShallowCopyDeepCopy
  284. 284. 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
  285. 285. 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
  286. 286. 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
  287. 287. 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
  288. 288. Accessor Methods// setter를 사용하게 되면 다음과 같은 validation(유효성) 검사가 가능하다// 이를 통해 더욱더 안전한 데이터 사용이 가능하다@implementation ClassA...- (void)setScore:(int)val {if( val 0 )score = 0;else score = val;}- (int)score { return score;}@end
  289. 289. Accessor Methods
  290. 290. 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;}
  291. 291. Property 속성지정분류 옵션 설명메소드지정getter=methodA getter를 명시적으로 지정메소드지정setter=methodB setter를 명시적으로 지정읽기쓰기속성readonly 읽기전용, getter만 생성읽기쓰기속성readwrite(*) 읽기쓰기스레드 처리atomic(*) 멀티쓰레드시 메쏘드 Lock스레드 처리nonatomic Non-atomic할당방식assign(*) 주소만 할당할당방식 retain 객체를 retain해서 할당할당방식copy 객체를 복사해서 할당
  292. 292. 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;
  293. 293. Property 속성지정@property (getter=score, setter=setScore:) int score;@synthesize score// 위 문장은 아래 코드를 생성한다. setScore, score 메소드를 생성한다
  294. 294. Property 속성지정@property (getter=score, setter=setScore:) int score;- (void)setScore:(int) val {score = val;}- (int)score {return score;}@synthesize score// 위 문장은 아래 코드를 생성한다. setScore, score 메소드를 생성한다
  295. 295. Property 속성지정@property (readonly, getter=score) int score;@synthesize score// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다
  296. 296. Property 속성지정@property (readonly, getter=score) int score;- (int)score {return score;}@synthesize score// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다
  297. 297. Property 속성지정@property (readonly, getter=scoreValue) int score;@synthesize score// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다// getter 메소드 scoreValue로 지정되어 있다
  298. 298. Property 속성지정@property (readonly, getter=scoreValue) int score;- (int)scoreValue {return score;}@synthesize score// 위 문장은 아래 코드를 생성한다// readonly속성에 의해 setScore메소드는 생성하지 않는다// getter 메소드 scoreValue로 지정되어 있다
  299. 299. Property 속성지정@property (readonly) int score;@synthesize score// 위 문장은 아래 코드를 생성한다.// 디폴트 getter 메소드 명은 속성값의 이름인 score이다.// readonly 속성에 의해 setScore메소드는 생성하지 않는다.
  300. 300. Property 속성지정@property (readonly) int score;- (int)score {return score;}@synthesize score// 위 문장은 아래 코드를 생성한다.// 디폴트 getter 메소드 명은 속성값의 이름인 score이다.// readonly 속성에 의해 setScore메소드는 생성하지 않는다.
  301. 301. 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;
  302. 302. Accessor Methods@property (retain) NSString *str;@property (copy) NSString *str;@property (assign) NSString *str;
  303. 303. 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]; } }
  304. 304. 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]; } }
  305. 305. 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;}
  306. 306. Property 속성지정@property (nonatomic, retain) UIButton *scoreButton;// nonatomic한 속성을 가진 scoreButton 메소드 생성// atomic한 객체는 안정성을 보장해야 하므로 임의의 스레드가// scoreButton 값을 사용하는 중에는 다른 스레드가 이 값에 대한 setter를// 호출하지 못하도록 한다.
  307. 307. 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;}
  308. 308. nonatomic vs atomic쓰레드- 어떠한 프로그램의 프로세스내에서 실행되는 흐름의 단위를 말함- 한 프로그램 내에는 여러개의 쓰레드가 동작할 수 있음- 하나의 값을 여러 쓰레드가 동시에 접근하여 변경하게 되면 문제가 발생
  309. 309. nonatomic vs atomicatomic- setter/getter는 다른 쓰레드 setter 메소드를 행하는 중에는접근할 수 없도록 한다.(read-write safety)- atomic한 접근을 보장하기 위해서는 수행 속도면에서 손해를 보게된다nonatomic- nonatomic 속성은 atomic한 기능을 보장하지 않는다- 대신 수행속도가 빠르다쓰레드 안정성(thread safety)- atomic은 쓰레드 안정성을 보장해 주지는 않는다- 즉 setter나 getter가 작동하는 중에 release가 이루어지게 되면crash가 발생하는데 이러한 부분까지는 atomic한 속성으로 보장해 주지않는다
  310. 310. Case which OftenCause Confusion
  311. 311. Using CollectionsNSMutableArray *array = #Get a mutable array#; NSUInteger i; // ... for (i = 0; i 10; i++) { NSNumber *convenienceNumber = [NSNumber numberWithInteger:i]; [array addObject:convenienceNumber]; }
  312. 312. Using CollectionsNSMutableArray *array =#Get a mutable array#;NSUInteger i; // ... for (i = 0; i 10; i++) { NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger:i]; [array addObject:allocedNumber];[allocedNumber release]; }
  313. 313. Returning Object from MethodWrong Case- (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@%@ %@, firstName, lastName] release]; return string;}- (NSString *)fullName { NSString *string = [[NSString alloc] initWithFormat:@%@ %@, firstName, lastName]; return string;}
  314. 314. Returning Object from MethodCorrect Case- (NSString *)fullName { NSString *string = [NSString stringWithFormat:@%@ %@, firstName, lastName]; return string;} - (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@%@ %@, firstName,lastName] autorelease]; return string;}
  315. 315. Automatic Reference CountingARC- 컴파일러 수준의 기능으로 객체의 참조 횟수를 추적하는 일을 프로그래머가 하지않고 컴파일러가 대신 수행하는 형태로 메모리 관리기능을 보강한 것이다.- Objective-C 언어자체의 기능은 아님- 2011년 Mac OS X Lion과 iOS 5 운영체제에서 도입되었다- Xcode 4.2부터 사용가능하다
  316. 316. ARC 규칙ARC 사용시의 규칙은 다음과 같다- retain, release, retainCount, autorelease, dealloc을 프로그래머가 직접 호출할 수 없다- id 형이나 void * 형을 직접 형변화시킬 수 없다- NSAutoreleasePool 객체를 사용할 수 없다- NSAllocateObject 와 NSDeallocateObject 함수를 호출할 수 없다- C 구조체내의 객체 포인트를 사용할 수 없다- 메모리 존(NSZone)을 사용할 수 없다
  317. 317. ARC 컴파일 옵션설정ARC 사용시 컴파일 옵션 설정- Project 시작시 Use Automatic Reference Counting을 체크
  318. 318. ARC 자동 변환기능ARC를 사용하지 않는 코드를 자동 변환하는 기능
  319. 319. ARC 컴파일 플래그Target - Build Setting에서- Objective-C Automatic Reference Counting을 YES로 설정
  320. 320. ARC 컴파일 플래그Build Phase - Compile Sources에서- -fobjc-arc 컴파일러 플래그 설정으로 arc 기능을 적용시킴- -fno-objc-arc 로 arc 기능을 적용시키지 않음
  321. 321. 프로퍼티 관련 지시어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;
  322. 322. 객체간의 참조ARC 기능-객체간의 참조 카운터를 자동으로 관리객체간의 참조- 1:1 참조 또는 1:n 참조가 가능strong 참조- 한 객체가 다른 객체를 strong 참조로 참조하고있는 경우, 참조되고 있는 객체가 소멸되지 않는다.weak 참조- 한 객체가 다른 객체를 weak 참조로 참조하고있는 경우, 참조되고 있는 객체의 생존은 보장되지 않는다
  323. 323. Retain CycletextparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretainDocument *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];// 상호참조로 인해 객체를 소멸시킬 수 없다
  324. 324. Retain CycletextparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretain
  325. 325. Weak ReferencetextparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretain
  326. 326. Weak ReferencetextparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretainDocument *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];
  327. 327. Weak Reference(약한 참조)textparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretain
  328. 328. Weak Reference(약한 참조)textparentparentparagraphParagraphPagepageDocumentretaindon’tretaindon’tretainretainstrong 참조의 경우 객체들이 상호참조를 할 경우순환고리로 인해 이들을 소멸시킬 수 없다이 때문에 memory 누수가 발생한다weak 참조의 경우 strong 참조와는 달리 참조되고있는 객체의 생존을 보장하지는 않는다
  329. 329. Strong Reference(강한 참조)ABCDE
  330. 330. Strong Reference(강한 참조)- A가 B를 참조하지 않게 되면ABCDE
  331. 331. Strong Reference(강한 참조)ABCDE
  332. 332. Strong Reference(강한 참조)- B가 소멸되어야 하지만 B를 E가 참조하고있고, E는 D가, D는 C가, C는 B가 참조하고 있어서 B,C,D,E는 소멸되지 않고 참조되지도 않는 메모리 누수(leak) 객체가 됨ABCDE
  333. 333. Weak Reference(약한 참조)ABCDE
  334. 334. Weak Reference(약한 참조)- E가 B를 참조하되 약한 참조를 할 경우ABCDE
  335. 335. Weak Reference(약한 참조)ABCDE
  336. 336. Weak Reference(약한 참조)- A가 B를 참조하지 않게 되면ABCDE
  337. 337. Weak Reference(약한 참조)ABCDE
  338. 338. Weak Reference(약한 참조)- B를 참조하는 E가 약한 참조이므로- B는 생존을 보장받지 못한다.- 이 때문에 B는 소멸가능한 객체가 되고ABCDE
  339. 339. Weak Reference(약한 참조)ACDE
  340. 340. Weak Reference(약한 참조)- B가 소멸되면 C는 참조하는 객체가 없으므로 소멸된다ACDE
  341. 341. Weak Reference(약한 참조)ADE
  342. 342. Weak Reference(약한 참조)- C가 소멸되면 D는 참조하는 객체가 없으므로 소멸된다ADE
  343. 343. Weak Reference(약한 참조)AE
  344. 344. Weak Reference(약한 참조)- D가 소멸되면 E는 참조하는 객체가 없으므로 소멸된다AE
  345. 345. Weak Reference(약한 참조)A
  346. 346. Weak Reference(약한 참조)- 상호참조 객체들이 있더라도 메모리 누수가발생하지 않는다A
  347. 347. Thank YOU!
  348. 348. Related linkshttp://Cocos2dDev.com/http://ivis.cwnu.ac.kr/tc/dongupak/https://www.facebook.com/groups/smartphone.forum/

×