发布主视图控制器(iOS)

时间:2012-05-22 20:16:24

标签: objective-c ios memory-management

我在Apple的网站上搜索过此内容,似乎只能使用Storyboard或导航控制器查找文档,我都没有使用过。这是关于内存管理的一个非常直截了当的问题。

我创建了一个完全空白的应用程序。在我的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?还有什么我说过的话似乎没什么问题吗?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

你是对的。通常,您应该释放在范围中创建的任何内容。但在这种情况下,您需要视图控制器的所有权。在这种情况下,您需要在应用代理的dealloc方法中释放对象:

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

或者,您可以使用retain标志为视图控制器定义@ property,然后执行以下操作:

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

顺便说一句,在任何一种情况下你都不需要转换为MenuViewController。

编辑:我完全错过了你没有将视图控制器添加到你的窗口。好点@Eimantas。