1. Objective-C
메모리 관리
By Changhoon Park
Objective-C
http://www.wawworld.me
Last Update : 2011. 08. 28
11년 10월 25일 화요일
2. 탄생과 죽음
객체는 alloc 또는 new로 태어난다.
객체의 일생이 끝나면 그 객체가 사용하던 메모리는
다음에 태어날 객체를 위하여 정리되어야 한다.
2
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
3. 참조횟수 (reference counting) / 유지횟수 (retain counting)
정수 값
객체를 사용하고 있다는 그 코드에서 객체의 참조횟수 증가
그 코드가 객체 사용을 다 끝내면 참조횟수 감소
참조횟수가 0이되면 아무도 그 객체를 사용하지 않음으로 소
멸되고 객체가 사용하던 메모리를 시스템에 반납
3
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
4. alloc / new / copy 객체의 참조횟수는 1
retain 참조횟수 증가
release 참조횟수 감소
참조횟수가 0일때
자동으로 메시지 전달
dealloc 객체 소멸
오버라이드 가능
4
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
5. 관련 API
- (id) retain;
- (void) release;
- (unsigned) retainCount;
5
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
8. 객체 소유권
하나 이상의 항목이 특정한 객체를 소유하고 있을때 발생
8
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
9. 엔진의 소유권은 누구인가?
! Engine *engine = [Engine new];
! [car setEngine: engine];
main 도 car 도 아닌 상황....
9
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
17. NSObject의 autorelease pool
-(id) autorelease;
어떤 객체에 autorelease를 보내면 그 객체가 NSAutoreleasePool에 추가
풀이 사라질 때, 풀에 있던 모든 객체에 릴리즈 메시지 전달
17
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일
19. AutoreleasePool 생성하기
NSAutoreleasePool* pool;
pool = [[NSAutoreleasePool alloc] init];
/* 여기서 부터 인련의 작업을 수행한다.
임시객체에게 autorelease 메세지를 보낸다.
*/
[pool release] /* 인스턴스는 여기서 해제 된다. */
19
메모리 관리 객체의 일생
오토릴리즈
Objective-C
코코아 메모리 관리 규칙
By Changhoon Park
http://www.wawworld.me
11년 10월 25일 화요일
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.me
11년 10월 25일 화요일