저는 Mac Dev의 초보자입니다. 나는 아이폰 dev에서 왔습니다. 제 질문은 모달이 아닌 창 관리와 관련이 있습니다. 아이폰과는 아주 다르며 메모리 관리 모델이다. 창이기 때문에 넌 모달 윈도우 메모리 관리
-(IBAction)showPreferenceController:(id)sender {
if (!preferenceController) {
preferenceController = [[PreferenceController alloc]init];
}
[preferenceController showWindow:preferenceController];
}
그러나이 코드
는, 윈도우 앱의 수명 동안 메모리에 남아있을 것입니다 : 예를 들어, 내가 환경 설정 창을 말, 난 창을 보여주기 위해 그런 일을 사용할 수 있습니다 결코 풀려나 지 않았다.
것을 방지하기 위해, 나는 또한 방법은 여기에 설명 사용할 수 있습니다
stackoverflow.com/questions/1391260/who-owns-an-nswindowcontroller-in-standard-practice
이 PreferenceController
에 + (id) sharedInstance
를 만들고 해제 윈도우 사용 (void)windowWillClose:(NSNotification *)notification
비 모달 윈도우가 공개되지 않는 많은 코코아 코드 샘플을 볼 수 있습니다. 예 : 여기에서 : http://www.mattballdesign.com/blog/2008/10/01/building-a-preferences-window/ : 환경 설정 패널 및 모든 하위보기가 awakeFromNib
에 생성되므로 모든 앱 수명 동안 메모리에 저장됩니다.
당신은 예를 들어 엑스 코드 앱 걸릴 경우, 비 모달 윈도우의 많은이 있습니다 :
- 글로벌 찾기 창 (CMD + MAJ + F)
- 앱 정보 패널
- 도움말 창
-. ..
가능한 한 메모리를 낮추기 위해 닫을 때이 창을 해제한다고 가정합니다. 코코아 응용 프로그램에서 모달이 아닌 창을 관리하는 가장 좋은 방법을 알고 싶습니다. 기억력을 유지 하시겠습니까? 서둘러 출시 하시겠습니까? 저는 Mac이 iPhone에 비해 많은 메모리를 가지고 있지만, 우리가 사용하지 않는 메모리 객체를 유지하는 것이 좋지 않다고 생각합니다.
감사합니다.
롭 포스트와 편집 :
내가 창으로 -autorelease을 보내고 그래서 나중에 창을 다시 것 nil을 내 포인터를 설정합니다. 이는 컨트롤러에 + sharedController를 사용할지 여부와 관련이 없지만 인용하는 기술과 유사합니다. 공유 컨트롤러가 있는지 여부에 관계없이이 작업을 수행 할 수 있습니다.
싱글 톤 (+ sharedController)이 없으면 그렇게하는 방법이 없습니다.
나는이 예제 무슨 뜻인지 설명 : 응용 프로그램 컨트롤러에서
:
@interface AppController : NSObject <NSApplicationDelegate> {
구현 :
@interface PreferenceController : NSWindowController <NSWindowDelegate>
구현 :
환경 설정 컨트롤러에서-(IBAction)showPreferenceController:(id)sender {
if (!preferenceController) {
preferenceController = [[PreferenceController alloc]init];
}
[preferenceController showWindow:preferenceController];
}
- (void)windowWillClose:(NSNotification *)notification {
[self autorelease];self=nil;
}
창이 닫히고 다시 열면 충돌이 발생합니다. preferenceController가 해제되었지만 nil과 같지 않습니다. 그래서 창이 닫힐 때 preferenceController를 nil로 설정해야합니다. 싱글 톤으로는 아무런 문제가 없습니다.
싱글 톤이 없으면 appController를 Preference Window의 델리게이트로 설정하여 윈도우가 닫힐 때 preferenceController를 nil로 설정할 수 있습니다. 하지만 나는 그런 식으로하지 않습니다. 프레스톤과 편집
는
내가 그것을 말하지 않았다 코멘트 그러나 나는 우리가
-(IBAction)showPreferenceController:(id)sender
여러 번 호출해도 내 비 모달 창 하나 개의 인스턴스 만합니다.
그 이유는 preferenceController가 nil과 같거나 appController가 아닌지 테스트하기 때문입니다.
그래서 창을 닫으면 appController에서 preferenceController를 nil로 설정해야합니다.
그래서 해결책은 다음과 같습니다
의 AppController에서 는 NSWindowWillCloseNotification을 듣고 :
- (void)windowWillClose:(NSNotification *)notification {
if ([notification object] == [preferenceController window]) {
[preferenceController autorelease];
preferenceController = nil;
}
}
이 맞습니까? 이것이 유일한 해결책입니까? 모달이 아닌 창을 관리하는 것이 조금 복잡해 보입니다 ...
여기에 '자기'를 공개해서는 안됩니다 (거의 자동으로 [자기 배포]라고 부르면 안됩니다). self.window를 해제하고 self.window = nil로 설정해야합니다. –
또한, 나는 이것을 권장합니다. [self.window autorelease]; self.window = nil; ' 그렇게하면 창은 실제로 해제되기 전에 닫을 수 있습니다. –
고마워요 롭, 내 예제는 말했듯이 예제가 충돌하기 때문에 문제를 설명하기 만하면됩니다. preferenceController를 nil로 설정하고 appController에서 구현해야합니다. 마지막 질문에 대한 질문을 편집했습니다. – Benoit