首先,将免责声明我针对的iOS 5,所以这非常可能是我的问题的根源,但如果没有...CLLocationManager不调用任何委托方法
我想写一个简单的类,通过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
和执行(忽略stuff-对涉及邮政编码就是类是最终的意思做,但现在我只是想获得一些坐标从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对象,对吧?
P.S.另外,我确实将CoreLocation框架添加到了我的项目中,并且我没有收到任何代码错误或警告,但是在我的应用程序中使用CoreLocation之前还需要做什么吗?
是的,这似乎是 - 关闭自动引用计数解决了问题。任何想法如何防止它释放位置管理器对象? – blabus
编译器会在你的调用之后生成一个'[zipCodeFetcher release]'。使用一个属性来保持对它的强烈参考。 –
完美工作 - 谢谢! – blabus