[英]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.