2011-09-16 148 views
1

首先,将免责声明我针对的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之前还需要做什么吗?

回答

10

ARC在getZipCode方法调用后解除分配新创建的对象。

+0

是的,这似乎是 - 关闭自动引用计数解决了问题。任何想法如何防止它释放位置管理器对象? – blabus

+0

编译器会在你的调用之后生成一个'[zipCodeFetcher release]'。使用一个属性来保持对它的强烈参考。 –

+0

完美工作 - 谢谢! – blabus

0

我还没有使用ARC,所以我不确定你的头文件的语法(readwrite与read write)。但我会把一个NSLog(@“我的本地经理是%@”,self.locationManager); getZipCode内部只是为了确保你有一个,它没有被发布之前,它有机会做任何事情。

+1

是的,它确实记录什么似乎是一个有效的CLLocationManager对象。我也试过(非原子,保留)的位置管理器属性,但仍然没有。 – blabus

+0

嗯。我唯一能想到的其他事情就是摆弄配置,设置为\t \t self.locManager.desiredAccuracy = kCLLocationAccuracyBest;和\t \t self.locManager.distanceFilter = kCLDistanceFilterNone; – Rayfleck

相关问题