нераспознанный селектор, отправленный экземпляру на синтезированном свойстве - PullRequest
0 голосов
/ 07 февраля 2012

Позвольте мне заявить, что я новичок в Objective-C / iOS.

Моя программа вылетает из-за необработанного исключения NSInvalidArgumentException, reason: [CLLocationManager copyWithZone:]: unrecognized selector sent to instance. Кажется, это довольно распространенная ошибка, и, насколько я могу судить, обычно это происходит, когда что-то идет не так с управлением памятью. Я смотрел на похожие вопросы о stackoverflow и Google, но ни один из них не выглядит совершенно одинаково.

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

magnetoTestViewController.h

#import <UIKit/UIKit.h>
@class CLLocationManager;

@interface magnetoTestViewController : UIViewController
@property(copy, readwrite) CLLocationManager *locManager;
@end

magnetoTestViewController.m

#import "magnetoTestViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface magnetoTestViewController()
- (void)startHeadingEvents;
@end

@implementation magnetoTestViewController

@synthesize locManager = _locManager;

...

- (void)startHeadingEvents {
NSLog(@"entered startHeadingEvents()");
if (!self.locManager) {
    CLLocationManager* theManager = [[CLLocationManager alloc] init];

    // Retain the object in a property.
    self.locManager = theManager;
    self.locManager.delegate = self;
}

// Start location services to get the true heading.
self.locManager.distanceFilter = 1000;
self.locManager.desiredAccuracy = kCLLocationAccuracyKilometer;
[self.locManager startUpdatingLocation];

// Start heading updates.
if ([CLLocationManager headingAvailable]) {
    NSLog(@"Yep, the heading is available.");
    self.locManager.headingFilter = 5;
    [self.locManager startUpdatingHeading];
}
else {
    NSLog(@"*sadface*, the heading information is not available.");
}
NSLog(@"exited startHeadingEvents()");
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
NSLog(@"locationManagerdidUpdateHeading() was called.");
if (newHeading.headingAccuracy < 0) {
    NSLog(@"the heading accuracy is smaller than 0.  returning.");
    return;
}

// Use the true heading if it is valid.
CLLocationDirection theHeading = ((newHeading.trueHeading > 0) ?
                                  newHeading.trueHeading : newHeading.magneticHeading);
NSString* myNewString = [NSString stringWithFormat:@"the heading is %d", theHeading];
NSLog(myNewString);

}

Мой код вводит метод startHeadingEvents (на основе моей регистрации), но происходит сбой перед выходом из метода (на основании того, что моя запись в журнал не вызывается). Я предполагаю, что copyWithZone (что есть в ошибке) - это метод CLLocationManager, вызываемый внутренне в какой-то момент. Я уверен, что где-то совершаю любительскую ошибку, кто-то может указать мне правильное направление?

1 Ответ

2 голосов
/ 07 февраля 2012

Ваша проблема в том, что вы используете «copy» в своем свойстве для CLLocationManager, который является одиночным - часто синглтоны определяются так, что они выдают исключение, чтобы предотвратить копирование одного экземпляра.

Вместо этого объявите вашу собственность так:

@property(nonatomic, strong) CLLocationManager *locManager;
...