Я не уверен, связано ли это с вашей проблемой, но я надеюсь, что это поможет: я недавно отслеживал объем памяти приложения и заметил, что даже после того, как сообщение dealloc отправлялось в контроллер представления после нажав «назад» на контроллере UINavigator, у меня осталось несколько десятков живых объектов, оставшихся после этой операции (вы можете увидеть это на панели «Распределения» приложения инструментов). Чтобы решить эту проблему, я использовал сочетание нескольких вещей:
Во-первых, я добавил следующие три метода в NSLog счетчиков сохранения моих пользовательских подпредставлений (можно найти здесь в SO на iOS4 - быстрое переключение контекста ):
#pragma mark - RETAIN DEBUG MAGIC
// -----------------------------------------------------------------------------
- (id)retain
{
NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
return [super retain];
}
- (void)release
{
NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
[super release];
}
- (id)autorelease
{
NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
return [super autorelease];
}
Затем я изолировал каждый из строительных блоков представления, оставив только одну простую задачу (например, загрузив UIButton в качестве подпредставления), и вернулся к приложению инструментов для отслеживания живых объектов (в Product> Profile в Xcode) и отключил все объекты с префиксами «NS», «CF» и «Malloc» (вы можете сделать это, нажав на маленькую кнопку i рядом с вкладкой «Распределения»). После этого выбрал «Call Trees» в нижней правой панели и продолжал сверлить, пока я не нашел несколько мест, где счетчик объектов увеличивался, когда я перемещался вперед и назад.
Обратите внимание, что вы можете дважды щелкнуть по символу, чтобы увидеть детали, относящиеся к вызовам, сделанным процессору. Кроме того, нажатие на маленький значок i откроет всплывающее окно с обратными следами для выделенного вызова.
При просмотре следов вы увидите, что у некоторых из них есть небольшая иконка, которая изображает человека на рамке (текст рядом с этими значками значительно темнее, чем визуальная подсказка). Двойной щелчок по ним приведет вас к строке кода, ответственной за этот вызов.
Ниже приведены несколько ссылок, которые могут помочь вам лучше понять инструменты:
Примечание:
В конце моего путешествия все, что мне нужно было сделать, это освободить свои взгляды после добавления их к своим «супер» представлениям, чтобы гарантировать, что они будут освобождены. то есть.,
[[self view] addSubView:aButton];
[aButton release];