gpt4 book ai didi

objective-c - 无法识别的选择器发送到合成属性上的实例

转载 作者:行者123 更新时间:2023-11-28 23:06:53 25 4
gpt4 key购买 nike

允许我说我是 Objective-C/iOS 的新手。

我的程序因未捕获的异常 NSInvalidArgumentException 而崩溃,原因:[CLLocationManager copyWithZone:]: 无法识别的选择器发送到实例。 这似乎是一个非常常见的错误,我能说的最好的就是它通常在内存管理方面出现问题时发生。我在 stackoverflow 和谷歌上看过类似的问题,但似乎没有一个完全相同。

我的应用程序是一个简单的单 View 应用程序。我正在尝试使用 CLLocationManager 类,因为我想获取用户的标题。我的代码:

ma​​gnetoTestViewController.h

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

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

ma​​gnetoTestViewController.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 的一种方法,在某些时候被内部调用。我确定我在某个地方犯了业余错误,有人可以指出我正确的方向吗?

最佳答案

您的问题是您在 CLLocationManager 的属性中使用“复制”,它是一个单例 - 通常单例被定义为抛出异常以防止复制单个实例。

相反,像这样声明您的属性(property):

@property(nonatomic, strong) CLLocationManager *locManager;

关于objective-c - 无法识别的选择器发送到合成属性上的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9172065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com