2010-03-04 2 views
1

저는 현재 Aaron Hillegaas의 유명한 "OSX 용 코코아 프로그래밍"을 진행하고 있습니다.Obj-C에서 수집 한 가비지에서 포인터를 유지하지 않고 창을 유지하는 방법?

는 12 장에서 그는 나에게 그 자체로 완벽하게 잘 작동

[BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self]; 

사용에 대한 창을 만들려고합니다. 그러나 나는 가비지 컬렉터를 사용하고 있기 때문에 윈도우에 대한 포인터를 보관하지 않기 때문에 가비지 수집되어 2 ~ 2 초 후에 사라집니다. 가비지 콜렉션이 사용 불가능하면 완벽하게 작동합니다.

가비지 컬렉터가 포인터를 사용하지 않고 창을 만들 수있는 방법이 있습니까?

+2

아론 Hillegaas 또한이 정보 창에 대한 출구를 만드는 것을 말한다. 그렇게하면 윈도우에 대한 포인터를 유지하고 가비지 수집을하지 않게됩니다. 나는 그것을 간과했다. – bastibe

답변

2

retain the windowCFRetain으로 사용하거나 NSGarbageCollectordisableCollectorForPointer:을 사용할 수 있습니다. 그러나 쉽게 메모리 누수가 발생할 수 있습니다. 창을 닫는 데 사용하는 작업이 창을 해제하는지 확인하십시오.

닫는 동작으로 전달 된 senderNSView에서 상속되면 window 속성을 사용하여 창에 대한 포인터를 가져올 수 있습니다.

그러나 이것은 코코아가 작동하도록 설계된 방법이 아닙니다. Hillegaas '책의 12 장에서, 그는이 말을 가지고

이 ShowWindow를 보내

: 처음은 NSWindowController 자동으로 nib 파일을로드하고 화면과 전면에 창을 이동합니다. nib 파일은 한 번만로드됩니다. 사용자가 [창]을 닫으면 화면 밖으로 벗어나지 만 할당이 해제되지 않습니다. 다음에 사용자가 [창]을 요청하면 간단히 화면으로 이동합니다.

정보 창을 할당 해제하면 앱이 충돌하거나 사용자가 두 번째로 열 때 응답하지 않는 것처럼 보입니다.

편집 : 다른 방법 (하지만 펜촉을로드 할 때 실습을 제공하지 않는 방법)은 NSWindowController 정보 윈도우를 주 펜촉에 추가하는 것입니다 (About 윈도우의 "Visible At Launch"속성을 선택 취소하십시오) . 이것은 Main.nib의 혼란을 야기하지만, Interface Builder에서 완전히 할 수 있습니다. 연결 :

  • 을 컨트롤러의 창 콘센트에 관하여에 정보 창에는 정보 창에 자신의 닫기 버튼을 한 경우
  • 메뉴 항목에 관하여에 대해 컨트롤러의 showWindow: 행동
  • 의에 연결 창문의 performClose: 동작. 이 과정이 얼마나 것이 좋습니다에 관해서는

, Apple has this to say :

매우 간단한 응용 프로그램은 하나의 nib 파일에 사용자 인터페이스의 구성 요소를 모두 저장할 수있을 수도 있지만 대부분의 응용 프로그램, 그것이 여러 nib 파일에 구성 요소를 배포하는 것이 더 좋습니다. 더 작은 nib 파일을 생성하면 즉시 필요한 부분 만로드 할 수 있습니다. nib 파일이 작을수록 응용 프로그램의 성능이 향상됩니다. 또한 문제를 찾을 곳이 적기 때문에 발생할 수있는 문제를 쉽게 디버그 할 수 있습니다.제 12 장에서

+1

물론 포인터를 붙이지 않는 경우 나중에 윈도우를 어떻게 풀어 놓을지가 흥미로운 질문입니다. (당신이 틀렸다는 것을 말하는 것은 아닙니다. 나는 원래의 질문이 잘못된 경로로 진행될 수 있다고 생각합니다.) – Chuck

+0

그건 내 걱정입니다. – outis

+0

무엇이 올바른 방법일까요? NSWindowController의 서브 클래스 NSWindowController는 인터랙티비티가없는 단순 About Window를위한 것인가? – bastibe