Не удается найти переустанавливаемый объект отладки на устройстве - PullRequest
1 голос
/ 09 августа 2011

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

5 голосов
/ 09 августа 2011

Когда-то у меня был сложный случай для определения местоположения по освобожденному объекту, поэтому я просто унаследовал от этого объекта 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

Я установил точки останова внутри этих методов и включил их на этапе, когда ожидал сбой. После этого я только начал проходить эти звонки один за другим и обнаружил проблему. Это сложно, но иногда может помочь, и я никогда не видел такого подхода, описанного на форумах. Может быть, это вам тоже поможет.

0 голосов
/ 09 августа 2011

Вызвать местоположение «didUpdate» вручную при запуске в симуляторе - по крайней мере, два вызова, время которых истекло около пяти секунд, после запуска диспетчера местоположения. Это должно вызвать ту же ошибку, что и на телефоне, тогда вы можете использовать NSZombies.

Кроме того, симулятор ДОЛЖЕН быть в состоянии выполнить код местоположения, я думал, что он был сломан в 4.2, но хорошо в 4.1.

...