Понимание инструментов iOS - PullRequest
0 голосов
/ 12 мая 2011

Я создаю приложение для iPhone.Столкнувшись с проблемами с памятью, я начал использовать инструменты для отслеживания любых проблем с памятью.Я сталкиваюсь с каким-то странным поведением, которое заставляет меня думать, что я либо неправильно использую инструменты, либо неправильно читаю их данные.

Это значения LiveBytes, записанные при входе и выходе из местоположения:

**Expensive Location-**
World (12 MB)
Loc (27 MB)
World (13 MB )
Loc (28 MB)
World (14 MB)
-Crash

**Cheap Location-**
World (12 MB)
Loc (23 MB)
World (13 MB )
Loc (24 MB)
World (14 MB)
-Crash

Обратите внимание на то, что я по-прежнему аварийно завершаю работу, даже если память о дешевом местоположении не находится рядом с памятью о дорогих местоположениях.Может ли кто-нибудь помочь мне здесь?

1 Ответ

1 голос
/ 15 мая 2011

Я не уверен, связано ли это с вашей проблемой, но я надеюсь, что это поможет: я недавно отслеживал объем памяти приложения и заметил, что даже после того, как сообщение 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];
...