我的iOS应用程序内存泄漏

时间:2011-11-02 13:18:34

标签: ios

我正在修复内存泄漏导致我的iPhone应用程序崩溃太多......

在appDelegate中,我使用以下代码来初始化tabbarcontroller。这是一个很好的方法吗,特别是“homeNavigationController.tabBarItem init”部分? (tabBarController是一个属性,在dealloc方法中释放)。

NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:4];
tabBarController = [[UITabBarController alloc] init];

// HomeTab view
HomeTabViewController *home = [[HomeTabViewController alloc] initWithNibName:@"HomeTabViewController" bundle:nil];
UINavigationController *homeNavigationController = [[UINavigationController alloc] initWithRootViewController:home];
[homeNavigationController.tabBarItem initWithTitle:NSLocalizedString(@"home", @"home") image:[UIImage imageNamed:@"home.png"] tag:1];
[localControllersArray addObject:homeNavigationController];
[homeNavigationController release];
[home release];

// My 3 others controllers
...
// End 3 other controllers

tabBarController.viewControllers = localControllersArray;
tabBarController.selectedIndex = 0;
[self.window addSubview:tabBarController.view];
[localControllersArray release];
[tabBarController setDelegate:self];
[self.window makeKeyAndVisible];

2 个答案:

答案 0 :(得分:3)

这个

[homeNavigationController.tabBarItem initWithTitle:NSLocalizedString(@"home", @"home") image:[UIImage imageNamed:@"home.png"] tag:1];

是泄漏。你应该把它改成:

UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"home", @"home") image:[UIImage imageNamed:@"home.png"] tag:1];
homeNavigationController.tabBarItem = tabBarItem;
[tabBarItem release]; // If you are not using ARC.

答案 1 :(得分:1)

我总是使用alloc-autorelease模式

 [[[class alloc] init] autorelease];

这确保始终会调用release。如果我需要保持对象,我将它分配给具有retain set的属性或将其传递给保留的方法。

Google的iOS指南中描述了这一点:

http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Prefer_To_autorelease_At_Time_of_Creation