繁体   English   中英

iOS内存泄漏导致更改视图控制器时崩溃

[英]iOS memory leaks causing crash in changing view controllers

我创建了两个视图控制器,其中有UIImage动画,它经常崩溃并在xcode工具中显示内存泄漏。

我的控制器代码-

- (void)viewDidLoad {
     NSArray *firstArray;
     firstArray = [NSArray arrayWithObjects:    
                    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"up0001" ofType:@"png"]],
                    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"up0002" ofType:@"png"]],
                                      ::
                                      ::
                   [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"up0035" ofType:@"png"]], nil];


     imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];

     imgView = UIViewContentModeScaleToFill;

     [imgView setAnimationImages:firstArray];

     imgView.animationDuration = 1.75;

     imgView.animationRepeatCount = 0;

     [imgView startAnimating];

     [self.view addSubview: imgView];
}
- (void)dealloc {
    [super dealloc];
    [imgView release]; 
    imgView = nil;
}

我通过获取appdelegate对象并在Appdelegate.m中调用以下appdelegate函数来将viewcontrollers更改为rootviewcontroller(请提出任何好的方法)

- (void)changeRootViewController:(NSString *)controllerName
{

    if(self.viewController){
        [self.viewController.view removeFromSuperview];
        self.viewController=nil;
    }

    if (controllerName == @"ViewController") {
        ViewController *lviewController =[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        self.viewController =  (RootViewController *)lviewController;
        [lviewController release];
        lviewController.view = nil;
        [self.window setRootViewController:self.viewController]; //LEAKS 100%
    } else if (controllerName == @"MainViewController") {
        // Use a different VC as roowViewController
        MainViewController *lviewController =[[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        self.viewController =  (RootViewController *)lviewController;
        [lviewController release];
        lviewController.view = nil;
        [self.window setRootViewController:self.viewController]; //LEAKS 100%
    } else if (controllerName == @"SecondViewController") {
        // Use a different VC as roowViewController
        SecondViewController *lviewController =[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        self.viewController =  (RootViewController *)lviewController;
        [lviewController release];
        lviewController.view = nil;
        [self.window setRootViewController:self.viewController];  //LEAKS 100%
    }

    [self.window makeKeyAndVisible];
}

并在我各自的控制按钮中调用此按钮,方法是-

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate changeRootViewController:@"ViewController"];

要么

 AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate changeRootViewController:@"MainViewController"];

我想在不使用Navigationbar的情况下通过我的主控制器交换控制器来管理视图控制器。请帮助我找出最佳方法,并避免泄漏。

看一下这段代码:


if (controllerName == @"ViewController") {
        ViewController *lviewController =[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        self.viewController =  (RootViewController *)lviewController;
        [lviewController release];
        lviewController.view = nil;
        [self.window setRootViewController:self.viewController]; //LEAKS 100%
    }

当分配“ lviewController”时,其保留计数为1;否则为0。 当您执行“ self.viewController”(因为我假设viewController是保留属性)时,则lviewController保留计数增加到2; 然后释放它,平衡以前的分配,保留计数返回到1; 最后,将其分配给rootViewController,这是一个保留的属性,因此lviewController的保留计数再次为2; 最终,当您在窗口中“交换”视图控制器时,lviewController被释放,因此它的保留计数变为1。如您所见,它永远不会被取消分配。 这意味着每次调用此函数都会泄漏。

您需要在代码中更改一些语句。

这行没有意义..

   imgView = UIViewContentModeScaleToFill;

通过使用一个函数,您必须将UIImageView属性的值设置为UIViewContentModeScaleToFill ,以在UIImageView文档中找到该函数。

[imageView setContentMode:UIViewContentModeScaleToFill];

与此相同...

lviewController.view = nil; //Remove this from your code ..

最后更改dealloc函数的实现并记住[super dealloc]; dealloc任何实现中,应该位于最后。

- (void)dealloc {
    [imgView release]; 
    imgView = nil;
    [super dealloc];
}

可能的泄漏归因于“ SecondViewController”,“ MainViewController”,“ ViewController”类中的代码。 崩溃的原因是您在[super dealloc]之后释放了图像视图

尝试这个,

- (void)dealloc {

     [imgView release]; 
     imgView = nil;
     [super dealloc];
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM