讓我來說說我是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的某個方法在內部調用的方法。我確信我在某個地方犯了一個業餘的錯誤,有人能指出我的方向嗎?