Не удается найти переустанавливаемый объект отладки на устройстве
У меня есть довольно большое приложение, которое работает в симуляторе, но создает в сценарии переизданного объекта на устройстве iPhone. Казалось бы, NSzombies - это путь, за исключением того, что объект не перепроизводится на симуляторе, а NSZombies не работает на устройстве. Через несколько часов регистрации я, кажется, был в состоянии зафиксировать это где-то между, когда я бегу -
[locManager startUpdatingLocation] и начало -
(void) locationManager: (CLLocationManager *) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation
Это объясняет, почему он работает на симуляторе, я не обнаруживаю способности определения местоположения и не запускаю этот код местоположения.
Когда я запускаю NSLog непосредственно перед и после [locManager startUpdatingLocation], мой объект NSString выделяется и присутствует. Но когда приложение выполняется и оно обращается к locationManager: NSLog показывает, что NSString освобождена, пропала. Этот строковый объект не имеет абсолютно никакого отношения к обработке местоположения или функциональности. Несвязанный NSString. Я закомментировал все другие потенциальные действия, закомментировал весь явный код релиза и не могу найти момент, когда это произойдет.
Я также разочарован тем, что lldb, похоже, не поддерживает точки наблюдения, а gdb поддерживает их, но эта версия, похоже, не работает! GDB установит аппаратную точку наблюдения, а затем XCode сообщит, что работает, но через 30 минут визуальная активность или перерыв все еще отсутствуют.
Я на Lion, Xcode 4.1.1 и слишком много кофе.
Какой подход я должен предпринять, чтобы найти этот выпущенный объект NSString в таком узком спектре деятельности и ограниченных инструментах?
2 ответа
Когда-то у меня был сложный случай для определения местоположения по освобожденному объекту, поэтому я просто унаследовал от этого объекта MyObject и переопределил сохранение и освобождение следующим образом:
Вот файл DebugString.h:
#import <Foundation/Foundation.h>
@interface DebugString : NSString
@end
А вот и файл DebugString.m:
#import "DebugString.h"
@implementation DebugString
- (id) retain {
NSLog(@"%i", [self retainCount]);
return [super retain];
}
- (void) release {
NSLog(@"%i", [self retainCount]);
[super release];
}
@end
Я установил точки останова внутри этих методов и включил их на этапе, когда ожидал сбой. После этого я только начал проходить эти звонки один за другим и обнаружил проблему. Это сложно, но иногда может помочь, и я никогда не видел такого подхода, описанного на форумах. Может быть, это поможет вам тоже.
При запуске в симуляторе вызовите местоположение "didUpdate" - как минимум, два вызова, время которых истекло примерно через пять секунд после запуска менеджера местоположений. Это должно вызвать ту же ошибку, что и на телефоне, тогда вы можете использовать NSZombies.
Кроме того, симулятор ДОЛЖЕН быть в состоянии выполнить код местоположения, я думал, что это было сломано в 4.2, но хорошо в 4.1.