2009년 07월 29일
autorelease
Objective-C 에서 두 가지의 개체 소멸 방식을 지원한다.
하나는 가비지 컬렉션이다. 이는 전자동 개체 소멸이며, 일반적인 스크립팅 언어와 같이 메모리를 관리한다. Java, C#, ActionScript 등에서 사용했던 방식으로 할당하고 버리면 된다.
하지만 아이폰에서는 가비지 컬렉터가 지원되지 않는다.
그래서 남은 한가지 방식을 서야만 한다.
이는 레퍼런스 카운터다.
이 방식은 해당 개체를 보유한 수만큼 해제하는 것이다.
alloc/retain 으로 개체를 보유하고, 이 수만큼 release시킨다. 동수의 릴리스가 발생하면 개체의 dealloc 메서드가 호출되고, 곧 소멸된다.
문제는 개체의 보유(alloc/retain)자가 이 개체를 책임지고 해제(release)해야 한다는 것이다.
일반적으로 개체를 만들거나 할당한 쪽에서는 이를 명확히 알고 있으니 문제가 없다.
문제는 새로운 개체를 만들어 리턴하는 메서드이다.
일반적으로 이렇게 만들어진 개체는 받은 쪽에서 해제해줘야 한다고 생각하기 쉬우나, oc는 여기에 다른 룰을 적용한다.
해제는 만든거나 보유한 쪽만 해야 하는 거다. 만들어진 개체를 받은 쪽은 할당도 보유도 하지 않는다면 해제할 의무가 없다.
이를 위해 autorelease라는 메서드가 존재한다. 개체에 이 메서드가 실행되면 일단 해제된 것으로 인식하지만 즉시 소멸되지는 않는다.
개체는 해당 개체를 넘겨받은 스쿠프가 끝날 때까지 살아남아 있으며, 그 이후에 소멸된다. (이 소멸시점은 명확하지 않다)
여기에는 예외가 있는데, 개체 생성을 전문으로 하는 메서드일 경우이다. (팩토리 메서드)
Cocoa프레임워크에서는 alloc-, new-, copy- 프리픽스는 이런 메서드를 의미한다. 이런 메서드로 생성된 개체는 명확하게 해제(release)해 주어야 한다. 그 외의 메서드에서는 새 개체가 반환되더라도 생성용이 아니라, 짧게 쓰고 끝내도록 하는 '편의' 메서드로, 이러한 개체는 해제하면 안된다. 또한 대부분의 경우, 이러한 개체는 생성 위치가 불명확하다. 명확하게 생성하는 메서드가 아닌 이상 해제하지 않으면 된다.
정리하면 다음과 같다.
새로운 개체를 생성(alloc)하거나, 보유(retain)한 수만큼만 해제(release)한다.
다른 메서드에서 만들어진 경우, 해당 메서드가 생성( alloc- new-. copy-) 메서드일 경우는 자신이 생성한 것과 같이 취급해 해제한다. 그 외의 경우는 외부에서 만들어진 것이므로, (보유하지 않는 이상) 해제하지 않는다.
# by | 2009/07/29 10:24 | Cocoa & Objective-C | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]