【发布时间】:2011-11-18 07:51:15
【问题描述】:
首先,免责声明是我的目标是 iOS 5,所以这很可能是我的问题的根源,但如果不是......
我正在尝试编写一个通过 CoreLocation 管理位置更新的简单类。但是,我看到一些非常奇怪的行为。我有一个自定义类,它基本上包装了 CLLocationManager 和委托方法。这是界面:
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@protocol CLZipCodeFetcherDelegate
@optional - (void)didReceiveZipCode:(NSString *)zipCode;
@end
@interface CLZipCodeFetcher : NSObject <CLLocationManagerDelegate> {
id <CLZipCodeFetcherDelegate> delegate;
CLLocationManager *locationManager;
}
@property (strong, readwrite) id <CLZipCodeFetcherDelegate> delegate;
@property (strong, read write) CLLocationManager *locationManager;
- (void)getZipCode;
@end
和实现(忽略与邮政编码相关的东西——这就是这个类最终要做的事情,但现在我只是想从 CoreLocation 获取一些坐标):
#import "CLZipCodeFetcher.h"
@implementation CLZipCodeFetcher
@synthesize delegate, locationManager;
- (id) init {
self = [super init];
if (self != nil) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
self.locationManager.purpose = @"Retrieve zip code";
}
return self;
}
- (void)getZipCode {
[self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"Received location");
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"Location failed");
}
@end
然后我在视图控制器中初始化该类的一个实例并调用该方法:
CLZipCodeFetcher *zipCodeFetcher = [[CLZipCodeFetcher alloc] init];
[zipCodeFetcher getZipCode];
现在,当我运行此应用程序时,该应用程序需要一点时间来加载,然后弹出警告对话框,要求允许该应用程序使用位置服务。然而,它一出现,就立即消失(太快了,我无法点击允许或拒绝按钮),什么也没有发生(没有调用委托方法)。如果我然后进入设备的位置设置,它确实为我的应用显示“关闭”。当我从该屏幕手动打开它然后再次尝试该应用程序时,没有出现警报对话框,但仍然没有任何反应。我的调试消息都没有记录。模拟器和我的 iPhone 4 上的行为是相同的。
所以基本上,有人知道为什么吗?我查看了所有类似的线程,许多问题都与内存管理有关,但我认为这不是问题,因为 ARC 应该管理我的 CLLocationManager 对象,对吧?
附:此外,我确实将 CoreLocation 框架添加到了我的项目中,并且没有收到任何代码错误或警告,但是在我的应用中使用 CoreLocation 之前我还需要做些什么吗?
【问题讨论】:
标签: iphone core-location cllocationmanager