1

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

有人可以解释以下内容:

请记住,应用程序委托和空的 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命令是否可靠,因为如果我不能理解这一点,我认为我无法在其他地方调试任何内存问题......

4

1 回答 1

7

官方文档中-retainCount所述,

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

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

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

于 2011-01-17T11:15:21.047 回答