2010-01-17 2 views
0

(이전 버전과의 호환성을 위해) NSViewController의 자체 버전을 구현하려고하는데 바인딩에 문제가 발생했습니다. 바인딩은 대상을 유지하므로 파일을 통해 바인딩 할 때마다 원형을 유지합니다. 소유자.NSViewController가 바인딩 메모리 누수를 피하는 방법은 무엇입니까? [샘플 응용 프로그램을 가지고]

그래서 저는 수퍼 뷰에서 내 뷰를 명시 적으로 제거하고 최상위 수준의 객체를 릴리스한다고 생각했습니다. 내 컨트롤러가 뷰를 더 이상지지하지 않아 바인딩을 처리 할 것이므로 릴리스합니다. 나랑 나는 갈 수있어. 그러나 어떤 이유로 든 내 View Controller는 아직 공개되지 않습니다. 여기에 문제를 나타내는 샘플 응용 프로그램입니다 :

http://dl.dropbox.com/u/34351/BindingsLeak.zip

그것을 실행, 그것을 구축하고, Cmd를-K 히트 빈 창으로 NIB를로드 ("편집"메뉴에서 "펜촉 만들기"). Cmd-K를 다시 눌러 첫 번째보기 컨트롤러 (TestNibOwner)를 해제하고 새 View Controller를로드하십시오. 그래도 이전보기 컨트롤러는 결코 할당 취소되지 않습니다.

체크 상자의 "값"바인딩을 제거하면 잘 풀립니다.

release/retain/autorelease 오버라이드에서 중단 점을 설정하면 _NSBindingInfo가 TestNibOwner를 유지하지만 누출 상태에서 중단되지 않습니다.

누구든지 문제를 해결하는 방법을 알고 계십니까?

+0

미안, 내가 먼저 프로젝트를 다운로드하고 싶지 않아 도와주세요. 코드를 제공 할 수 있습니까? –

답변

1

동일한 문제에 대해 수행 한 한 가지는 내 펜촉 안에 프록시 NSObjectController를 만드는 것입니다. 내 NSViewController와 같은 클래스는이 프록시에 대한 포인터를 가지며 모든 바인딩은이를 통해 바인딩됩니다. 뷰 컨트롤러를 정리하려면 개체 컨트롤러에서 [selfProxy setContent : nil]을 수행하고 뷰 컨트롤러를 해제합니다. 이 경우 NSObjectController 프록시는이 경우 자동 언 바인더로 작동합니다.

더 많은 수작업으로보기를 해제 할 수는 있지만 보관 문제는 해결됩니다.

당신의 펜촉에서
-(void) releaseTopLevelObjects 
{ 
    // Unbind the object controller's content by setting it to nil. 
    [selfProxy setContent:nil]; 

    NSLog(@"topLevelObjects = %@", topLevelObjects); 
    [topLevelObjects release]; 
    topLevelObjects = nil; 
} 

, 바인딩과 같은 경로를 통해 일어날 것 :

난 당신이 이렇게 좋을 것

selfProxy.content.representedObject.fooValue 
+0

감사! 나는 웹상에서 많은 수정 작업을 시도해 보았지만 이것이 실제로 감히 해결할 수있는 해결 방법이다. 그래도 자동 바인딩 해제를 수행 할 실제 방법은 없습니다. – uliwitness

0

슈퍼 뷰에서보기를 제거 할 때 다른 메시지를 보내시겠습니까? 펜촉에서 보관 취소하여 만들었지?

+0

예, releaseTopLevelObjects는보기 (및 거기에있을 수있는 다른 보관되지 않은 객체)를 해제합니다. 적어도 그것이해야 할 일입니다. – uliwitness

2

클래스 덤프 및 친구들에 대해 조사한 결과, Apple에는 NSViewController 및 NSWindowController와 같은 클래스에 대해 더러운 작업을 처리하는 NSAutounbinder라는 개인 클래스가있는 것 같습니다. 그것이 어떻게 작동하는지 또는 복제하는 법을 실제로 알 수는 없습니다.

로드 된 펜촉의 임의 바인딩에 대한 유지주기를 방지하는 방법에 대한 귀하의 질문에 답변을 드릴 수는 없지만, 아마도 애플이 속임수를 쓰고 있다는 것을 아는 것은 아마도 위안입니다. 분명한. :-)