我的应用程序出现了一些内存管理问题和随机崩溃。我已经做了很多工作来尝试通常清理代码并将项目转换为ARC。
我现在对问题有一个清晰的看法 - 本质上应用程序不会释放视图,因此当用户在应用程序中移动时,每个视图都会重新加载并保留,直到应用程序因内存问题而崩溃为止。
我有一个UINavigationController。我的应用仅在横向左方向运行。当我使用
[window setRootViewController:viewController];
加载然后
[self.window addSubview:[finalViewController view]];
新视图以纵向显示 - 如果我在加载时用代码将其旋转到横向左侧,则会出现各种其他随机问题。
如果使用
代替addSubview[self.viewController.view removeFromSuperview];
[self.window setRootViewController:finalViewController];
viewController = nil;
self.viewController = nil;
window.viewController = nil;
旋转正常,但视图未发布,我的应用程序存在内存问题,最终崩溃。任何想法都会很棒 - 欣赏我可能会遗漏一些相当基本的东西。谢谢&节日快乐!
答案 0 :(得分:2)
如何在应用中加载新观看次数?如果您使用的是UINavigationController,您的AppDelegate应该启动如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RootViewController* rootController = [[RootViewController alloc] init];
UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:rootController];
[self.window setRootViewController:navController];
[self.window makeKeyAndVisible];
return YES;
}
要加载另一个视图(例如按下按钮),您将在根视图中执行以下操作:
SecondViewController *secondView = [SecondViewController alloc] init];
[self.navigationController pushViewController:secondView animated:YES];
这将使UINavigationController负责视图的内存管理。
对于旋转,可以通过为每个ViewControllers提供此方法来处理:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft) return YES;
return NO;
}
只要您按照要使用的方式使用UINavigationController,就不应该有任何非释放视图。您应该阅读UINavigationController:http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html
另一种可能性是视图控制器的子视图具有对其父视图/控制器的强引用。这将阻止父视图控制器解除分配,因为它为子视图提供了一个保留计数为1,而子视图也为父视图提供了保留计数1。这是一篇SO帖子,其中包含强大的信息。弱引用:Objective-C declared @property attributes (nonatomic, copy, strong, weak)