메모리 관리 코드에서 객체가 특정 소유자, 즉 객체가 소유 한 객체에 속하지 않은 상황을 처리 할 때 권장되는 방법이 무엇일까 궁금합니다. 하나의 예제는 NSWindowController의 하위 클래스가 될 수 있습니다. NSWindowController는 단일 윈도우의 입력과 출력을 구성, 표시 및 관리합니다. 컨트롤러 개체는 창을 표시하고 나중에 어느 지점에서 스스로를 해제합니다 (대개 관리하는 창이나 시트가 닫힐 때). AppKit은 몇 가지 예제도 제공합니다. NSAnimation은 startAnimation에서 자체를 유지하고 애니메이션이 끝나면 자동으로 해제됩니다. 또 다른 예는 NSWindow이며, 닫을 때 자체를 해제하도록 구성 할 수 있습니다.Objective-C 가비지 컬렉션의 자체 소유 객체
이러한 "자체 소유"개체를 직접 구현할 때 적어도 세 가지 다른 GC 안전 패턴이 표시되지만 모든 패턴에는 몇 가지 단점이 있습니다.
a). CFRetain/CFRelease를 사용합니다.
자체 소유 객체가 작업을 시작하기 전에 자체에서 CFRetain을 호출합니다 (예 : 윈도우가 표시되기 전에 윈도우 컨트롤러 예제에서). 그런 다음 CFRelease()가 완료되면 자체에서 (예 : 창을 닫은 후 창 컨트롤러 예제에서) CFRelease()를 호출합니다.
장점 : 객체의 사용자는 메모리 관리에 대해 걱정할 필요가 없습니다.
단점 : 순수 ObjC 코드에서 GC를 사용하고 있지만 메모리 관리 기능을 사용해야하므로 추한 것입니다. CFRelease()가 호출되지 않으면, 누수를 찾기가 어려울 수 있습니다.
b). 정적 데이터 구조로 자체 소유 관용구 피하기.
Object는 작업을 시작하기 전에 자신을 데이터 구조 (예 : 정적 변경 가능 배열)에 추가하고 완료되면 자체에서 객체를 제거합니다.
장점 : 객체의 사용자는 메모리 관리에 대해 걱정할 필요가 없습니다. 메모리 관리 기능을 호출하지 않습니다. 객체에는 명시 적 소유자가 있습니다. 누출 가능성을 쉽게 발견 할 수 있습니다.
단점 : 개체가 다른 스레드에서 생성 될 수 있으면 잠금이 필요합니다. 추가 데이터 구조.
c). 객체의 사용자가 객체에 대한 참조를 저장하도록 요구함으로써 자기 소유 관용구를 피하십시오 (예 : ivar).
장점 : 메모리 관리 기능을 호출하지 않습니다. 객체에는 명시 적 소유자가 있습니다.
단점 : 객체의 사용자가 객체를 더 이상 필요로하지 않더라도 참조를 유지해야합니다. 여분의 ivars.
이 사례를 처리하기 위해 어떤 패턴을 사용 하시겠습니까?