2012-05-22 3 views
0

저는 Apple 사이트에서이를 검색했으며 스토리 보드 또는 탐색 컨트롤러를 사용하여 설명서를 찾지 못했지만 둘 중 어느 것도 사용하고 있지 않습니다. 그것은 메모리 관리에 대한 믿을 수 없을만큼 간단한 질문입니다.메인 뷰 컨트롤러 (iOS) 해제하기

완전히 빈 응용 프로그램을 만들었습니다. 내 AppDelegate의 didFinishLaunchingWithOptions 함수에서 필자가 만든 View Controller의 인스턴스를 만들고 있습니다. 내 디자인 (자체적으로 문제가 될 수 있음)은보기 컨트롤러와 뷰간에 1 : 1 관계를 유지하는 것입니다.

그래서 내 모든 응용 프로그램의 시작 메뉴는 MenuViewController.h/m에 있습니다. .H에서

:

MenuViewController *m; 

하는 .m에서 : 나는 혼란 스러워요 곳

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 

    m = (MenuViewController *)[[MenuViewController alloc] init]; 
    m.window = self.window; 
    [m doStuff]; // handful of functions, not actually called this 
    //[m release]; // doesn't make sense to me 
    return YES; 
} 

이다. 기본적으로 응용 프로그램 수명주기 전체에 대해이 기능을 사용하고 싶습니다. 그러나 나는 또한 현재 함수의 범위 내에서 할당 한 모든 것을 해제해야한다는 인상하에있다. 그 이상으로 필요하다면 먼저 다른 곳에 보관해야합니다. 이것은 사실이 아닌가?

내 기본적인 질문은 ...이 View Controller를 어디에서 출시해야합니까? 내가 말했던 그 밖의 것들이 쾅하는 것 같니?

+0

왜 자동 참조 계산을 사용하지 않았습니까? (아마도 AppDelegate의 'applicationWillTerminate : application'에서 해제 할 수 있습니다) – Chris

+0

다음보기로 이동하기 전에 해제 할 것입니다. 또한 viewDidUnload 또는 dealloc 메서드에서 – anuragbh

답변

2

초기화가 잘못되었습니다. 컨트롤러에 창을 할당하지 않으면 창에 컨트롤러를 할당합니다.

// window creation code here 
    ... 
    m = [[MenuViewController alloc] init]; 
    [window setRootViewController:m]; // window does retain for m 
    [m release]; // so we release it here 
    [self.window makeKeyAndVisible]; 
    return YES 
} 
+0

RootViewController 내 것을 의미 할 수 있습니다. 내 응용 프로그램의 모든 "화면"에 대한보기 컨트롤러가 올바르지 않거나 불량한 디자인입니까? 현재 메인 메뉴, 로딩 화면, 사용자 생성 화면, 다른 데이터 관리 화면 등을 가지고 있습니다. – JamesB41

+0

정확히 어떻게해야할까요? 물론 뷰 컨트롤러 하위 클래스를 한 번 이상 사용하는 것이 합리적 일 수도 있지만 성격과 기능면에서 매우 다른 화면의 경우 대개 개별 뷰 컨트롤러 하위 클래스가 있습니다. – DrummerB

+0

@ JamesB41 그래서 대부분의 앱에는 몇 가지보기 컨트롤러를 제공하거나 드릴 다운 탐색 기능을 제공 할 수있는 탭바 컨트롤러 또는 탐색 컨트롤러가 있습니다. – Eimantas

0

맞습니다. 일반적으로 범위에서 만드는 모든 것을 릴리스해야합니다. 하지만이 경우보기 컨트롤러의 소유권이 필요합니다.

- (void)dealloc { 
    [m release]; 
    [super dealloc]; 
} 

는 다른 방법이 플래그를 유지하여 뷰 컨트롤러에 대한 @property을 정의 할 수 있습니다 다음이 수행합니다 :이 경우 앱 위임의 dealloc 방법으로 객체를 해제 할 필요가

MenuViewController *viewController = [[MenuViewController alloc] init]; 
self.m = viewController; 
[viewController release]; 

Btw, 두 경우 모두 MenuViewController로 캐스팅 할 필요가 없습니다.

편집 : 완전히보기 컨트롤러에 윈도우를 추가하지 않았다. 좋은 지적 @이 만타.

+0

이후 AppDelegate에서 메소드를 호출하고 경고를 던지기 때문에 캐스팅 만하면됩니다. – JamesB41

+0

앱 대리인에서보기 컨트롤러의 헤더를 가져 왔습니까? 변수 (m)가 MenuViewController 유형 (사용자 게시물에 따라 다름)이고 전달하는 값이 같은 유형 인 경우, 형변환을하지 않아도됩니다. 그 경고에는 다른 이유가 있어야했습니다. – DrummerB