2012-12-17 4 views
1

작고 간단한 상태 메뉴 응용 프로그램을 개발 중입니다.
메뉴가 있으며 사용자가이를 클릭하면 HUD 창 (NSPanel)이 나타납니다. 이것은 내가 패널을 표시하는 방법입니다사용자가 닫을 때 NSPanel을 할당 해제하는 것을 피하는 방법

  1. 응용 프로그램이 시작 내가 해고 :

    [hudWindow orderOut: nil]; 
    

    그래서 이벤트 체인의 :

    [hudWindow makeKeyAndOrderFront: self]; 
    

    이 내가 창문을 기각하는 방법입니다 창문;

  2. 그러면 사용자 (즉, :-))가 메뉴 항목을 클릭하고 패널을 표시합니다.
  3. 그런 다음 x를 클릭하고 패널을 닫습니다.
  4. 그런 다음 메뉴 항목을 다시 클릭하면 창이 다시 나타나지 않습니다.

아마도 할당이 해제되어서 약한 저장소를 넣었습니다. 그렇지 않으면 __unsafe_unretained를 사용하면 두 번째 실행시 충돌이 발생합니다.
그래서 사용자가 클릭 할 때 창 할당을 피하는 방법이 있다면 추측하고 있습니다.
강력한 저장 용량을 사용해 보았지만이 경우 두 번째 실행에서 다시 닫을 수 없어 문제가됩니다.
사용자가 "죽일"수없는 창을 표시 할 수있는 많은 메뉴 상태 응용 프로그램이 있습니다. 비슷한 것을 만들 것입니다.

+3

IB의 "Closed When Closed"체크 박스를 선택 취소 했습니까? 이 상자는 기본적으로 패널에 대해 선택됩니다. – rdelmar

+0

그랬 으면, 강하지 만 그것이 효과가없는 이유를 분명히해야합니다. –

+0

아마도 releasedWhenClosed 설정이이를 무시하기 때문일 수 있습니다. 강력한 포인터를 가지고 있다는 것은 보유 개수가 적어도 하나는된다는 것을 의미하지만 시스템이 패널에 명시 적으로 해제 메시지를 보내는 것을 막지는 않습니다. – rdelmar

답변

2

IB에서 "Closed When Closed"체크 박스를 선택 해제해야합니다 (또는 코드에서 이에 상응하는 조치를 취 했음). 이 상자는 기본적으로 패널에 대해 선택됩니다.

강력한 포인터를 사용하면 아마도 releasedWhenClosed 설정이 무시하기 때문에 작동하지 않습니다. 강력한 포인터를 가지고 있다는 것은 보유 개수가 적어도 하나는된다는 것을 의미하지만 시스템이 패널에 명시 적으로 해제 메시지를 보내는 것을 막지는 않습니다.

+2

또한 "Closed When Release"설정은 소유권과 동일하지 않습니다. 그 설정은 당신 * 당신의 소유권을 해제합니다. ARC를 사용하는 경우 ARC는 NSWindow가 수행할지 여부를 알지 못하는 상태에서 항상 소유권을 해제하므로 "종료 할 때 해제"를 해제해야합니다. (플립 측면에서 펜촉에서 창을 직접로드하는 경우 암시 적 유지를 취소하려면 * on *을 지정해야합니다 자세한 내용은 Resources Programming Guide를 참조하십시오.) –

0

약점에서 강하게로 속성을 변경할 수 없습니까?

+0

내가보기에 "약한 저장 공간을 두었습니다. 그렇지 않으면 __unsafe_unretained를 사용하면 두 번째 실행시 충돌이 발생할 것입니다"- 이것이 의미하는 것입니까? 당신이 그것을 강하게 바꿀 수없는 이유는 설명하지 않습니다. – paulmelnikow

+0

위로부터 네 번째 줄 : "나는 강력한 저장 장치를 사용하려고 시도했지만이 경우 두 번째 시작시 다시 닫을 수 없어 문제가됩니다." 그렇게하면 패널을 닫을 수 없습니다. 창은 직접 할당 해제되고 해제되지 않을 수 있습니까? –

+0

ARC를 사용하는 경우 창이 열리지 않도록 속성을 강하게 유지해야합니다. '-orderOut :'대신에'-performClose :'를 창에서 호출 해 볼 수 있습니다. – paulmelnikow

관련 문제