Позвольте мне заявить, что я новичок в 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, вызываемый внутренне в какой-то момент. Я уверен, что где-то совершаю любительскую ошибку, кто-то может указать мне правильное направление?