не занимаясь деллоками - PullRequest
       12

не занимаясь деллоками

2 голосов
/ 12 апреля 2010

У меня есть это в суперпредставлении:

mySubView = [[MySubView alloc] init];
[self addSubview:mySubView];
[mySubView release];

затем, в какой-то момент позже, во вспомогательном представлении это:

[self removeFromSuperview];

когда я отлаживаю его, я замечаю, что dealloc для подпредставления никогда не вызывается, хотя я вполне уверен, что счетчик ссылок должен быть 0. Есть идеи, почему это может быть? спасибо.

Ответы [ 4 ]

3 голосов
/ 12 апреля 2010

Да, когда вы отправляете removeFromSuperview, впоследствии отпустите сообщение, отправленное. И каждый вызов уменьшения выпуска сохраняют счет. А в случае:

MySubView * mySubView = [[MySubView alloc] init];
[window addSubview:mySubView];
[mySubView release];
[mySubView removeFromSuperview];

результат будет таким, как вы ожидаете: после removeFromSuperview счетчик хранения mySubView станет 0, и будет вызван dealloc.

но в вашем примере за «потом, в какой-то момент позже» больше кода, а некоторый другой объект (и это не суперпредставление) сохраняет mySubView. Например, вы можете зарегистрировать значение retainCount, чтобы увидеть, где ваш вид сохранен / освобожден.

1 голос
/ 12 апреля 2010

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

Внимание! Этот метод обычно не имеет значения при отладке проблем управления памятью. Поскольку любое количество объектов инфраструктуры может сохранять объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков для объекта, маловероятно, что вы сможете получить полезную информацию из метод. Чтобы понять основные правила управления памятью, которые вы должны соблюдать, прочтите «Правила управления памятью». Для диагностики проблем управления памятью используйте подходящий инструмент: Статический анализатор LLVM / Clang обычно может обнаруживать проблемы с управлением памятью даже до запуска вашей программы. Инструмент Object Alloc в приложении Instruments (см. Руководство пользователя Instruments) может отслеживать распределение и уничтожение объектов. Shark (см. Руководство пользователя Shark) также профилирует распределение памяти (среди множества других аспектов вашей программы).

0 голосов
/ 13 апреля 2010

Я уверен, что счетчик ссылок должен быть 0.

Ты? Почему?

Забудьте сохранить счет. Думайте только с точки зрения владения объектом, потому что сохранение значений почти полностью бессмысленно в качестве помощи при отладке управления памятью.

Apple предоставляет множество инструментов для отладки проблем управления памятью. Используйте их.

Эта ссылка может быть полезной.

http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingPatterns.html

0 голосов
/ 12 апреля 2010

Я не знаю, делает ли это removeFromSuperview , но указатель в суперпредставлении должен быть освобожден. Если removeFromSuperview только освобождает указатель в подпредставлении на суперпредставление, а не указатель в суперпредставлении на подпредставление, это может быть источником вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...