我一直在通过我的应用程序试图处理所有内存问题并阅读内存管理。 我开始使用[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命令是否可靠,因为如果我无法理解这一点,我认为我不能在别处调试任何内存问题......
答案 0 :(得分:7)
如official documentation for -retainCount
中所述,
重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法
不要依赖-retainCount
。其他对象可能会在您不知情的情况下保留您的对象,而自动释放的对象可能会给您一个错误的实际保留计数印象。
您可以依靠Apple的框架对象来做正确的事情,并在适当的时候放弃对象的所有权,并且您需要确保您也在这样做。