0

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

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

4

1 回答 1

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 声明的 @property 属性(非原子、复制、强、弱)

于 2012-12-26T02:13:01.783 回答