2012-05-22 53 views
0

我在蘋果網站上搜索了這個,並且似乎只能使用故事板或導航控制器來查找文檔,這兩者都不是我正在使用的。這是一個關於內存管理的令人難以置信的簡單問題。正在發佈主視圖控制器(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; 
} 

這是我很困惑。我希望這存在基本上整個應用程序生命週期。但我也有這樣的印象:你應該(在當前函數的範圍內)發佈你分配的任何東西。如果你需要的話,你應該先在別處保留它。這是不是真的?

我的根本問題是......我應該在哪裏發佈這個視圖控制器?還有什麼我說過的,看起來不合時宜?

+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這就是爲什麼大多數應用程序都具有tabbar控制器或導航控制器,這些控制器或導航控制器允許呈現幾個視圖控制器或具有深入導航。 – Eimantas

0

您說得對。通常你應該釋放你在範圍內創建的任何東西。但在這種情況下,您需要視圖控制器的所有權。在這種情況下,你需要釋放對象的應用程序委託的dealloc方法:

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

或者,您也可以定義一個@property與保留標誌您的視圖控制器,然後做到這一點:

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

順便說一句,無論在哪種情況下都不需要投射到MenuViewController。

編輯:我完全錯過了,你不把你的視圖控制器添加到你的窗口。好點@Eimantas。

+0

我只需要施放它,因爲我之後從AppDelegate調用了一個方法,並且它正在發出警告。 – JamesB41

+0

您是否在應用程序委託中導入了視圖控制器的標題?如果你的變量(m)的類型是MenuViewController(根據你的帖子),你傳遞給它的值是同一類型的,那麼你不需要投射。該警告必須有其他原因。 – DrummerB

相關問題