Правильная отладка в Xcode (touch-какао) - PullRequest
0 голосов
/ 05 января 2010

У меня в экземпляре приложения есть переменная экземпляра lat (NSString). Что я хочу сделать, это установить эту переменную равной текущей широте пользователя в didUpdateToLocation:fromLocation, чтобы я мог получить к ней доступ из другого представления. Это ключ. Итак, у меня есть этот код:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation {

    appDelegate = (myProjectAppDelegate *)[[UIApplication sharedApplication] delegate];

    appDelegate.lat = [[NSString alloc] initWithFormat:@"%g",newLocation.coordinate.latitude];
}

С точки зрения отладки, когда я выполняю po appDelegate.lat в консоли, когда здесь установлена ​​точка останова, тогда я могу видеть значение отлично. Когда я иду в свой ViewController, где я хочу использовать значение, я получаю out of scope, когда нахожу его, и cannot access memory at 0x0, когда я пытаюсь po appDelegate.lat. Это из вида контроллера:

    [appDelegate.locMan startUpdatingLocation];

    NSLog(@"here");
    NSLog(appDelegate.lat);

Поскольку для моего утверждения NSLog(appDelegate.lat) ничего не печатается, я могу только предположить, что что-то не так.

Как правильно отладить это.

Спасибо.

Ответы [ 3 ]

1 голос
/ 05 января 2010

Может потребоваться увидеть больше кода, но похоже, что вы не сохраняете свойство appDelegate viewController. Конечно, сообщение cannot access memory at 0x0 означает нулевой указатель.

Если вы видите свойство lat в делегате приложения, но не видите его из viewController, то проблема заключается в связи между appDelegate и viewController. Если вы видите .lat в одном методе viewController, но не в другом, это говорит о том, что атрибут appDelegate viewController не сохраняется должным образом.


Edit01:

Следует добавить, что вы можете установить точку останова для регистрации и продолжить на

@synthesize lat;

строка в исходном файле appDelegate. Это будет регистрировать каждый раз, когда один из синтезированных аксессоров / сеттеров вызывается. Это скажет вам, когда свойство действительно было получено или установлено. Вы можете использовать функцию отладчика в той же точке останова, чтобы также вывести значение lat.

Если вам нужна дополнительная информация, вы можете написать явные методы доступа / сеттера и поместить в них операторы журнала. Я сомневаюсь, что вам нужно зайти так далеко в этом случае.

0 голосов
/ 28 октября 2010

Код выше на самом деле правильный. Вы передаете сообщения одиночному делегату приложения и, конечно же, не хотите сохранять сильную ссылку на него.

Без дополнительного кода немного сложно увидеть поток программы, но похоже, что вы передаете startUpdatingLocation в LocationManager, на который ссылается ваш подкласс делегата приложения. Сначала я проверю, установлен ли делегат LocationManager для класса, из которого вы получили ваш второй фрагмент, иначе он никогда не будет обработан. Однако, похоже, что это так, как вы, кажется, видите обновление в своих инструкциях NSLog.

Во-вторых, я бы помнил, что LocationManager будет обновляться асинхронно. Не ожидайте получать обновление сразу после начала обновления местоположения. Поэтому вполне разумно ожидать, что значение lat будет равно нулю в течение нескольких секунд после начала обновления.

В-третьих, я бы посмотрел на другой контроллер (где вы пытаетесь прочитать результат). Вы находитесь в точке останова в классе, когда пытаетесь получить делегат приложения?

Кстати, архитектура вашего приложения выглядит немного (извините) ужасно. Есть ли какая-то причина, по которой вам нужно так тесно связывать делегат приложения и контроллеры? Более элегантный способ может заключаться в создании собственного синглтона управления местоположением и размещении на нем уведомлений. Любой заинтересованный класс может подписаться на эти уведомления об обновлении местоположения.

0 голосов
/ 05 января 2010

Без дополнительного кода и некоторого затянувшегося праздника похоже, что вы получаете локальную копию делегата приложения и устанавливаете на нее lat ivar, а локальная копия делегата приложения уничтожается (вместе с последним ivar вы устанавливаете на него) при выходе и, таким образом, вы получаете пустой указатель, когда пытаетесь позже получить значение lat.

Я считаю, что создание геттеров / сеттеров для объектов лучше всего передавать данные из одного объекта в другой в приложениях типа какао.

Создайте метод «setter» в делегате приложения, который принимает значение lat, устанавливает его внутренне для объекта делегата приложения в защищенном свойстве и, наконец, создает отдельный метод «getter», который просто возвращает значение lat из приложения делегировать. Или используйте методы setter / getter для любого объекта, который имеет смысл в вашем приложении.

Соглашение об именах обычно такое: "setNAMEOFVAR" и "getNAMEOFVAR" для сеттеров и геттеров соответственно.

Это должно сработать для вас.

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