首先,免责声明我的目标是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对象,对吗?
P.S。另外,我确实将CoreLocation框架添加到我的项目中,并且没有代码错误或警告,但在我的应用程序中使用CoreLocation之前还有什么需要做的吗?
答案 0 :(得分:10)
ARC在getZipCode方法调用之后释放新创建的对象。
答案 1 :(得分:0)
我还没有使用ARC,所以我不确定标题中的语法(readwrite与read write)。
但我会放一个NSLog(@“我的loc经理是%@”,self.locationManager);在getZipCode中只是为了确保你有一个并且在它有机会做任何事情之前它没有被释放。