ARC - 管理内存 - 在app崩溃之前,视图不会被释放,分配也会增加

时间:2012-12-25 10:52:19

标签: ios memory-management view uiviewcontroller automatic-ref-counting

我的应用程序出现了一些内存管理问题和随机崩溃。我已经做了很多工作来尝试通常清理代码并将项目转换为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;

旋转正常,但视图未发布,我的应用程序存在内存问题,最终崩溃。任何想法都会很棒 - 欣赏我可能会遗漏一些相当基本的东西。谢谢&节日快乐!

1 个答案:

答案 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)