Memory 관리

984 views

Published on

http://wawworld.me

changhoonpark@gmail.com

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
984
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Memory 관리

  1. 1. Objective-C 메모리 관리 By Changhoon Park Objective-C http://www.wawworld.me Last Update : 2011. 08. 2811년 10월 25일 화요일
  2. 2. 탄생과 죽음 객체는 alloc 또는 new로 태어난다. 객체의 일생이 끝나면 그 객체가 사용하던 메모리는 다음에 태어날 객체를 위하여 정리되어야 한다. 2 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  3. 3. 참조횟수 (reference counting) / 유지횟수 (retain counting) 정수 값 객체를 사용하고 있다는 그 코드에서 객체의 참조횟수 증가 그 코드가 객체 사용을 다 끝내면 참조횟수 감소 참조횟수가 0이되면 아무도 그 객체를 사용하지 않음으로 소 멸되고 객체가 사용하던 메모리를 시스템에 반납 3 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  4. 4. alloc / new / copy 객체의 참조횟수는 1 retain 참조횟수 증가 release 참조횟수 감소 참조횟수가 0일때 자동으로 메시지 전달 dealloc 객체 소멸 오버라이드 가능 4 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  5. 5. 관련 API - (id) retain; - (void) release; - (unsigned) retainCount; 5 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  6. 6. @implementation RetainTracker - (id) init { ! if (self = [super init]) { ! ! NSLog (@"init: Retain count of %d.", ! ! ! [self retainCount]); ! } ! return (self); ! } // init - (void) dealloc { ! NSLog (@"dealloc called. Bye Bye."); ! [super dealloc]; ! } // dealloc @end // RetainTracker 6 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  7. 7. int main (int argc, const char * argv[]) { RetainTracker *tracker = [RetainTracker new]; // count: 1 ! [tracker retain]; // count: 2 NSLog (@"%d", [tracker retainCount]); [tracker retain]; // count: 3 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 2 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 1 NSLog (@"%d", [tracker retainCount]); [tracker retain]; // count 2 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count 1 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 0, dealloc it ! return (0); } // main 7 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  8. 8. 객체 소유권 하나 이상의 항목이 특정한 객체를 소유하고 있을때 발생 8 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  9. 9. 엔진의 소유권은 누구인가? ! Engine *engine = [Engine new]; ! [car setEngine: engine]; main 도 car 도 아닌 상황.... 9 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  10. 10. 문제 1 - (void) setEngine : (Engine * ) newEngine { ! engine = [ newEngine retain]; } Engine *engine1 = [Engine new]; // count:1 [car setEngine: engine1];! // count: 2 [engine1 release];!! // count: 1 Engine *engine2 = [Engine new]; // count: 1 [car setEngine: engine2];! // engine1= count: 1 // engine2= count: 2 10 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  11. 11. 문제 1 - (void) setEngine : (Engine * ) newEngine { [engine release]; ! engine = [ newEngine retain]; } Engine *engine1 = [Engine new]; // count:1 [car setEngine: engine1];! // count: 2 [engine1 release];!! // count: 1 Engine *engine2 = [Engine new]; // count: 1 [car setEngine: engine2];! // engine1= count: 0 // engine2= count: 2 11 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  12. 12. 문제 2 - (void) setEngine : (Engine * ) newEngine { [engine release]; ! engine = [ newEngine retain]; } Engine *engine = [Engine new]; !// count:1 Car *car1 = [Car new]; Car *car2 = [Car new]; [car1 setEngine: engine];! ! // count: 2 [engine release];!! ! ! // count: 1 [car2 setEngine:[car1 engine]]; !// oops! 12 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  13. 13. 문제 2 -(void) setEngine: (Engine *)newEngine { [newEngine retain]; [engine release]; engine = newEngine; } Engine *engine = [Engine new]; !// count:1 Car *car1 = [Car new]; Car *car2 = [Car new]; [car1 setEngine: engine];! ! // count: 2 [engine release];!! ! ! // count: 1 [car2 setEngine:[car1 engine]]; !// count: 1 13 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  14. 14. 문제 1 -(void) setEngine: (Engine *)newEngine { [newEngine retain]; [engine release]; engine = newEngine; } Engine *engine1 = [Engine new]; // count:1 [car setEngine: engine1];! // count:2 [engine1 release];! ! // count: 1 Engine *engine2 = [Engine new]; // engine2 = count: 1 [car setEngine: engine2];! // engine2 = count: 2 ! ! ! ! ! ! ! ! ! ! ! // engine1 = count: 1 14 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  15. 15. 접근자의 참조횟수 관리 - (void) setEngine : (Engine * ) newEngine { ! engine = [ newEngine retain]; } Engine *engine1 = [Engine new]; // count:1 [car setEngine: engine1];! // count: 2 [engine1 release];! ! // count: 1 Engine *engine2 = [Engine new]; // count: 1 [car setEngine: engine2];! // count: 2 15 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  16. 16. description의 memory leak -(NSString *) description { ! NSString *description; ! description=[[NSString alloc] initWithFormat: @"I am %d years old",4]; ! return (description); } NSString *desc = [someObject description]; NSLog(@"%@",desc); [desc release]; 16 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  17. 17. NSObject의 autorelease pool -(id) autorelease; 어떤 객체에 autorelease를 보내면 그 객체가 NSAutoreleasePool에 추가 풀이 사라질 때, 풀에 있던 모든 객체에 릴리즈 메시지 전달 17 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  18. 18. description의 memory leak -(NSString *) description { ! NSString *description; ! description=[[NSString alloc] initWithFormat: @"I am %d years old",4]; ! return ([description autorelease]); } NSLog(@"%@",[someObject description]); 18 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  19. 19. AutoreleasePool 생성하기 NSAutoreleasePool* pool; pool = [[NSAutoreleasePool alloc] init]; /* 여기서 부터 인련의 작업을 수행한다. 임시객체에게 autorelease 메세지를 보낸다. */ [pool release] /* 인스턴스는 여기서 해제 된다. */ 19 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일
  20. 20. 실제 풀 사용하기 int main (int argc, const char * argv[]) { NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; ! RetainTracker *tracker; tracker = [RetainTracker new]; ! // count: 1 ! [tracker retain]; ! ! ! ! // count: 2 [tracker autorelease]; ! ! ! // count: still 2 [tracker release]; ! ! ! ! // count: 1 ! NSLog (@"releasing pool"); [pool release]; // gets nuked, sends release to tracker ! return (0); } 20 메모리 관리 객체의 일생 오토릴리즈 Objective-C 코코아 메모리 관리 규칙 By Changhoon Park http://www.wawworld.me11년 10월 25일 화요일

×