Не удается найти переустанавливаемый объект отладки на устройстве

У меня есть довольно большое приложение, которое работает в симуляторе, но создает в сценарии переизданного объекта на устройстве 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.

Другие вопросы по тегам