Цель C отладка - PullRequest
       15

Цель C отладка

2 голосов
/ 04 февраля 2010

Я следовал примеру по разработке iPhone 3.В главе 8 я допустил ошибку в коде.

    - (NSMutableDictionary *)mutableDeepCopy
{
 NSMutableDictionary * ret = [[NSMutableDictionary alloc] initWithCapacity:[self count]];

 NSArray * keys = [self allKeys];
 for (id key in keys) {
  id oneValue = [self valueForKey:key];
  id oneCopy = nil;

  if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])
   oneCopy = [oneValue mutableDeepCopy];
  else if ([oneValue respondsToSelector:@selector(mutableCopy)])
   oneCopy = [oneValue mutableCopy];
  if (oneCopy == nil)
   oneCopy = [oneValue copy];
  [ret setValue:oneCopy forKey: key];
 }
 return ret;
}

Во втором responseToSelector, вместо mutableCopy выше, я по ошибке записал его как mutableDeepCopy.В результате мое создание изменяемого массива из обычного оказалось не простым копированием.

В результате консоль напечатает сообщение об ошибке, например:

2010-02-04 19: 58: 28.381 Разделы [1806: 20b] * WebKit отбросил невыполненное исключение вwebView: shouldInsertText: replaceDOMRange: данное действие: делегат: * - [NSCFArray removeObjectAtIndex:]: мутирующий метод, отправленный неизменяемому объекту

Теперь мой вопрос, это действительно сложно для меня отладитьписать свой собственный код вместо того, чтобы просто копировать его из книги.Как я узнаю, в какой строке встречается этот "метод мутации, отправляемый неизменяемому объекту"?

1 Ответ

3 голосов
/ 04 февраля 2010

Шаг 1. Использование отладчика.

Выполнить -> Отладчик или Shift-Command-Y. Когда ваша программа сталкивается с ошибкой, подобной приведенной выше, вы можете увидеть, где в коде она была остановлена. Вы можете увидеть инструкции Apple по использованию отладчика для деталей, но основные вещи довольно легко понять. Наиболее важной частью является панель списка потоков в верхнем левом квадранте отладчика. Это позволит вам перемещаться вверх и вниз по стеку, чтобы увидеть, где в вашем коде произошла ошибка. Обычно вы можете использовать это, чтобы определить, какой из ваших объектов был объявлен неизменным и не изменяемым.

Шаг 2. Используйте инструменты.

Инструменты мощные и позволят вам сделать некоторые довольно изящные вещи. В этой ситуации, как только вы узнаете адрес памяти, если ваш случайно неизменный объект, вы можете использовать Инструменты, чтобы увидеть историю этого объекта и, надеюсь, отследить его до его происхождения. Чтобы использовать инструменты для отслеживания объекта, вам нужно запустить инструменты с распределением объектов («Выполнить» -> «Выполнить с помощью Performance Tool» -> «Распределение объектов»). Если вам известен адрес загрязненного объекта, вы можете найти его в правом нижнем углу инструментов, в поле поиска. Откройте расширенное представление сведений (Command-E), чтобы увидеть, где находился этот объект.

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