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

Ben*_*Ben 1 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]);
Run Code Online (Sandbox Code Playgroud)

这是日志〜

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命令是否可靠,因为如果我无法理解这一点,我认为我不能在别处调试任何内存问题......

小智 7

正如官方文件中所述-retainCount,

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

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

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

  • 苹果应该在试图使用`retainCount`之类的时候制作Xcode吐出警告. (3认同)