为什么保留计数如此之高?内存管理

时间:2011-01-17 11:09:10

标签: iphone memory-management uinavigationcontroller retaincount

我一直在通过我的应用程序试图处理所有内存问题并阅读内存管理。 我开始使用[object retainCount]来跟踪我的内存分配。 这是否值得信任,因为我一直觉得这些计数真的很奇怪?

有人可以解释以下内容:

请记住,这个app委托和一个空的mainViewController没什么区别。 initWithRootViewController导致计数上升,但我没有看到添加一个的另一种方法....

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      


/* Create the View Controllers */  
UIViewController *mainViewControl = [[[MainViewController alloc] init] autorelease];


/* Create the Navigation Controller */
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:mainViewControl] autorelease];


NSLog(@"retain count: %i",[mainViewControl retainCount]);

/* Set the toolbar to purple */
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
navigationController.navigationBar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4];
navigationController.navigationBar.translucent = YES;

NSLog(@"retain count: %i",[mainViewControl retainCount]);
navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent;
navigationController.toolbar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4];
navigationController.toolbar.translucent = YES;

[navigationController setNavigationBarHidden:YES animated:NO];
[navigationController setToolbarHidden:YES animated:NO];

NSLog(@"retain count: %i",[mainViewControl retainCount]);

[window addSubview:[navigationController view]];

NSLog(@"retain count: %i",[mainViewControl retainCount]);

这是日志〜

2011-01-17 19:47:21.278 ANA[5653:207] 3
2011-01-17 19:47:21.282 ANA[5653:207] 4
2011-01-17 19:47:21.286 ANA[5653:207] 7
2011-01-17 19:47:21.287 ANA[5653:207] 12
2011-01-17 19:47:21.301 ANA[5653:207] Load View

我不明白为什么更改这些属性或引用navigationController会导致保留计数出现。

我在没有自动释放的情况下完成了它并手动释放但结果是一样的。 基本上我没有得到它,并想知道retainCount命令是否可靠,因为如果我无法理解这一点,我认为我不能在别处调试任何内存问题......

1 个答案:

答案 0 :(得分:7)

official documentation for -retainCount中所述,

  

重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法

不要依赖-retainCount。其他对象可能会在您不知情的情况下保留您的对象,而自动释放的对象可能会给您一个错误的实际保留计数印象。

您可以依靠Apple的框架对象来做正确的事情,并在适当的时候放弃对象的所有权,并且您需要确保也在这样做。