отслеживать "сообщение, отправленное на освобожденный экземпляр" с помощью инструментов - PullRequest
4 голосов
/ 26 ноября 2011

В XCode 4.2 мне нужна помощь с инструментами, чтобы отследить причину ошибки EXC_BAD_ACCESS.После включения флага NSZombie, я вижу следующее на консоли, когда приложение падает на устройстве.

*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x8674e30

Я использовал Инструменты, но не вижу профиль для Zombie.Я использовал профиль Allocations, но быстро заблудился.Я включил ARC (в надежде избавиться от alloc / retain / release) для приложения - но все еще имею ту же проблему.

Как мне использовать инструменты, чтобы отследить это?

Ответы [ 5 ]

9 голосов
/ 29 ноября 2011

Есть ли у вас * UIScrollView * s в иерархии ваших представлений, и вы отправляете им такие сообщения, как scrollToVisibleRect: animated:?

Если это так, попробуйте передать NO для анимированного параметра.Похоже, что iOS5 может иметь некоторые проблемы с представлениями прокрутки и встроенной анимацией.Точно такой же сбой, который вы видите, сводил меня с ума в течение нескольких дней (без стека вызовов), и я, наконец, сузил его до вызова прокрутки.Надеюсь, это поможет.

2 голосов
/ 03 сентября 2012

У меня была такая же проблема.Сначала я использовал решение Раффаэлло Коласанте и передал NO на scrollRectToVisible:animated:.Но потом я заметил, что этот метод обрабатывается в другом потоке.Вы должны проверить, вызываете ли вы [uitableview scrollRectToVisible: CGRectMake(0,0,1,1) animated:YES] в главном потоке (все действия пользовательского интерфейса должны выполняться в основном потоке).Я изменяю свой код так, чтобы он вызывался в главном потоке.

С:

//method called not from main thread
...
[someObjectInstance setOptionalActions:optActions];

Кому:

//method called not from main thread
...
dispatch_async(dispatch_get_main_queue(), ^{
    //now method called from main thread
    [someObjectInstance setOptionalActions:optActions];
});

Примечание: (вызов setOptionalActions :) -> ( scrollRectToVisible: animated: )

Теперь проблема устранена.

PS Вместо использования Grand Central Dispatch (GCD) , вы можете использовать другой подход :

@implementation SomeObjectClass  
...
- (void) setOptionalActions:(NSArray *) actionsArray {
    ... // handling of array
    [myTableView scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];
}
...
@end

//method called not from main thread, but will be performed on main thread
[someObjectInstance performSelectorOnMainThread:@selector(setOptionalActions:) withObject:optionalActions waitUntilDone:NO];
1 голос
/ 28 ноября 2011

Профилируйте или запустите инструменты (команда + I), затем используйте инструмент Leaks.
Leaks tool screenshot
Внутри нажмите на часть утечки и установите флажок Gather Leaked memory content.
properties screenshot
Удачи.

0 голосов
/ 28 ноября 2011

Используйте команду:

Shell malloc_history process_id memory

например. Оболочка malloc_history process_id 0x11afab80

Включить отслеживание для того же 1) MallocstackLogging 2) NsDebugEnabled 3) NSZombieEnabled

это решит проблему

0 голосов
/ 27 ноября 2011

Взгляните на мой ответ об использовании профиля зомби на симуляторе.В основном вы должны иметь возможность использовать профилирующее устройство:

  1. Измените режим запуска на профиль.
  2. Выберите зомби из списка.
  3. Когда он кэширует зомбидважды щелкните трассировку стека справа, чтобы увидеть различные части жизненного цикла объектов.
...