我在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?还有什么我说过的话似乎没什么问题吗?
答案 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。