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

Iphone iOS内存泄漏导致更改视图控制器时崩溃,iphone,ios,uiviewcontroller,uinavigationbar,Iphone,Ios,Uiviewcontroller,Uinavigationbar,我已经创建了两个视图控制器,其中有UIImage动画。它经常崩溃,并且在xcode仪器中显示内存泄漏 我的控制器代码- 通过获取appdelegate对象并在我的appdelegate.m中调用以下appdelegate函数,我将ViewController更改为我的rootviewcontroller(请建议任何好的方法) 在我各自的控制器中调用这个按钮- AppDelegate *appDelegate = [[UIApplication sharedApplication] delegat

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

我的控制器代码- 通过获取appdelegate对象并在我的appdelegate.m中调用以下appdelegate函数,我将ViewController更改为我的rootviewcontroller(请建议任何好的方法)

在我各自的控制器中调用这个按钮-

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


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

可能的泄漏是由于“SecondViewController”、“MainViewController”、“ViewController”类中的代码造成的。崩溃的原因是你在[super dealoc]之后发布了图像视图

试试这个

- (void)dealloc {

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

可能的泄漏是由于“SecondViewController”、“MainViewController”、“ViewController”类中的代码造成的。崩溃的原因是你在[super dealoc]之后发布了图像视图

试试这个

- (void)dealloc {

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

您需要更改代码中的某些语句

这句话没有意义

   imgView = UIViewContentModeScaleToFill;
有一个函数使用它,您必须将
UIImageView
属性的值设置为
UIViewContentModeScaleToFill
UIImageView
文档中查找该值

[imageView setContentMode:UIViewContentModeScaleToFill];
这个也一样

lviewController.view = nil; //Remove this from your code ..
最后更改dealoc函数的实现,并记住
[super dealoc]dealloc
的任何实现中,code>应位于最后

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

您需要更改代码中的某些语句

这句话没有意义

   imgView = UIViewContentModeScaleToFill;
有一个函数使用它,您必须将
UIImageView
属性的值设置为
UIViewContentModeScaleToFill
UIImageView
文档中查找该值

[imageView setContentMode:UIViewContentModeScaleToFill];
这个也一样

lviewController.view = nil; //Remove this from your code ..
最后更改dealoc函数的实现,并记住
[super dealoc]dealloc
的任何实现中,code>应位于最后

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

看看这段代码:


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; 当您执行“self.viewController”时,我假设viewController是一个保留属性,那么lviewController retain count将增加到2; 然后释放它,平衡之前的alloc,并将retaincount返回到1; 最后,将其分配给rootViewController,这是一个保留属性,因此lviewController retain count再次为2;
最后,当您在窗口中“交换”视图控制器时,lviewController被释放,因此它的保留计数变为1。正如你所看到的,它永远不会被解除。这意味着每次调用此函数时,都会发生泄漏。

请看这段代码:


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; 当您执行“self.viewController”时,我假设viewController是一个保留属性,那么lviewController retain count将增加到2; 然后释放它,平衡之前的alloc,并将retaincount返回到1; 最后,将其分配给rootViewController,这是一个保留属性,因此lviewController retain count再次为2;
最后,当您在窗口中“交换”视图控制器时,lviewController被释放,因此它的保留计数变为1。正如你所看到的,它永远不会被解除。这意味着每次调用此函数时,都会发生泄漏。

首先,我建议您了解并修复存储泄漏。你运行过Analyzer吗?是的,我运行过leaks工具,并对代码中显示的漏洞进行了注释。像这样(//Leaks100%)Analyzer比leaks工具工作得更好,第一次通过。首先,我建议您了解并修复存储泄漏。你运行过Analyzer吗?是的,我运行过leaks工具,并对代码中显示的漏洞进行了注释。像这样(//Leaks100%)Analyzer比leaks工具工作得更好,第一次通过。如果你在其他地方不需要“viewController”属性,就直接避免它。所以,在拥有alloc init lviewController之后,将其添加为self.window的根控制器,然后(自动)释放它。一旦窗口将处理此视图控制器(通过分配不同的根控制器),旧的视图控制器将被释放并解除锁定。最后,你为什么不使用ARC?谢谢你的回答。现在肯定会考虑ARC。如果你不需要别处的“VIEWController”属性,简单地避免它。所以,在拥有alloc init lviewController之后,将其添加为self.window的根控制器,然后(自动)释放它。一旦窗口将处理此视图控制器(通过分配不同的根控制器),旧的视图控制器将被释放并解除锁定。最后:为什么不使用ARC?谢谢你的回答。现在一定要考虑ARC了。