오너쉽 정책(ownership policy)이란 인스턴스 객체의 오너가 그 인스턴스의 해제에 대해 책임 진다는 것 입니다.
오너쉽 정책은 프로그램 언어가 갖춘 메커니즘이나 기능이 아니라 개발을 할때의 관례와 같은 것으로 이 정책을 반드시 지키지 않아도 프로그램 개발이 가능 합니다. 다만 이 정책에 따라 프로그램을 개발 하면 동적으로 만들어진 인스턴스가 어느 객체에 의해 해제되는지를 명확하게 파악 할 수 있기 때문에 쉽게 분석할 수 있는 프로그램을 만들 수 있습니다.
alloc... 을 사용한 인스턴스 생성
- 이 경우 메세지를 보낸객체가 생성된 인스턴스의 오너 입니다.
copy... 를 사용한 인스턴스의 복사
- 이 경우 메세지를 보낸 객체가 복사된 인스턴스의 오너 입니다.
retain을 사용한 보존
- 메세지를 보낸 객체가 리시버한 인스턴스의 오너 입니다.
인스턴스의 오너인 객체는 그 인스턴스 필요 없게 되었을 때 해제해야 할 책임이 있습니다.
구체적으로 release 혹은 autorelease 메세지를 보내서 오너쉽을 포기하는 것을 말합니다.
레퍼런스 카운트가 0이 되어 오너가 없어진 인스턴스는 그 시점에서 해제 됩니다.
거꾸로 인스턴스의 오너가 아닌 객체가 release나 autorelease 메세지를 보내는 것은 원칙적으로 금지되어 있습니다.
메세지의 인수로 객체를 전달 하거나 리턴값으로 객체를 전달 해야 할 경우가 있습니다. 이런 경우 오너쉽은 어떻게 처리 될까요?
메세지의 인수로 절달되든, 리턴값 형태이든 취급하는 방법은 동일하고 이 두가지 어느 경우도 오너쉽이 이동 하지는 않습니다.
단 인스턴스를 전달 받은 객체가 전달받은 인스턴스를 보존할지 여부는 그 메세지의 내용에 따라 자유롭게 결정 할 수 있습니다.
또 인스턴스를 전달 하는 쪽에서 인스턴스를 더이상 사용하지 않을 경우, 미리 autorelease 메세지를 보내 오너쉽을 포기한 후 전달 하기도 합니다. 이 두가지가 동시에 이루어 지면 결과적으로 오너쉽이 이동한 효과가 생깁니다.
그리고 한가지 주의할 점은 새로인스턴스를 만들어 자동변수에 대입하는 경우에는 메소드가 종료 하기 전에 오너쉽을 확실히 포기해야 합니다. 메소드가 종료되어 자동변수가 없어지면 나중에 그 인스턴스를 해제 하고 싶어도 못하기 때문입니다.
바로 아래의 예와 같은 경우 입니다.
- (id) temporaryValue
{
id tmp = [[ComplexData alloc] initWithData:myValue];
return [tmp autorelease];
}