0

我在 Apple 的网站上搜索过这个,似乎只能找到使用 Storyboards 或 Navigation Controllers 的文档,我都没有使用它们。这是一个关于内存管理的非常简单的问题。

我创建了一个完全空白的应用程序。在我的 AppDelegate 的 didFinishLaunchingWithOptions 函数中,我正在创建一个我已经构建的视图控制器的实例。我的设计(这本身可能是一个问题)是在视图控制器和视图之间建立 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;
}

这就是我感到困惑的地方。我希望它基本上存在于整个应用程序生命周期中。但我也觉得你应该(在当前函数的范围内)释放你分配的任何东西。如果除此之外还需要它,则应首先将其保留在其他地方。这不是真的吗?

我的基本问题是......我应该在哪里发布这个视图控制器?还有什么我说的似乎不合时宜的吗?

4

2 回答 2

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
}
于 2012-05-22T20:23:26.437 回答
0

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

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

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

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

顺便说一句,无论哪种情况,您都不需要强制转换为 MenuViewController。

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

于 2012-05-22T20:23:29.697 回答