Почему удержание так высоко? Управление памятью - PullRequest
1 голос
/ 17 января 2011

Я возвращался к своему приложению, пытаясь решить все проблемы с памятью и читая об управлении памятью. Я начал использовать [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<br> 2011-01-17 19:47:21.282 ANA[5653:207] 4<br> 2011-01-17 19:47:21.286 ANA[5653:207] 7<br> 2011-01-17 19:47:21.287 ANA[5653:207] 12<br> 2011-01-17 19:47:21.301 ANA[5653:207] Load View

Я не понимаю, почему изменение этих свойств или ссылки на navigController приводит к увеличению количества сохраняемых данных.

Я сделал это без авто-выпусков и тоже выпустил вручную, но результат тот же. По сути, я не понимаю, и задаюсь вопросом, является ли команда retainCount надежной, потому что, если я не могу понять это, я не думаю, что смогу отладить какие-либо проблемы с памятью в другом месте ...

1 Ответ

7 голосов
/ 17 января 2011

Как указано в официальной документации для -retainCount,

Важно: Этот метод обычно не имеет значения при отладке проблем управления памятью.Поскольку любое количество объектов каркаса могло сохранить объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков для объекта, маловероятно, что вы можете получить полезную информацию из этогоmethod.

Не полагайтесь на -retainCount.Другие объекты могут сохранять ваш объект без вашего ведома, а автоматически выпущенные объекты могут дать вам неверное представление о фактическом количестве сохраненных элементов.

Вы можете положиться на объекты инфраструктуры Apple, чтобы поступить правильно и отказаться от владения вашим объектом.возьмите объект, когда это уместно, и вам нужно убедиться, что вы также делаете это.

...