【问题标题】:CLLocationManager not calling any delegate methodsCLLocationManager 没有调用任何委托方法
【发布时间】: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


    【解决方案1】:

    ARC 在调用 getZipCode 方法后释放新创建的对象。

    【讨论】:

    • 是的,这似乎是它 - 关闭自动引用计数可以解决问题。知道如何防止它释放位置管理器对象吗?
    • 编译器会在你调用之后生成一个[zipCodeFetcher release]。使用属性保持对其的强引用。
    • 我不明白:他-确实-对位置经理有强烈的参考。为什么要释放它?
    • 嗨 greg,他没有对CLZipCodeFetcher 的强引用,所以在方法调用之后整个图都被释放了。
    【解决方案2】:

    我还没有使用过 ARC,所以我不确定标题中的语法(读写与读写)。

    但我会放一个 NSLog(@"my loc manager is %@", self.locationManager);在 getZipCode 内部只是为了确保你有一个并且在它有机会做任何事情之前它不会被释放。

    【讨论】:

    • 是的,它确实记录了看似有效的 CLLocationManager 对象。我也尝试了(非原子,保留)位置管理器属性,但仍然没有。
    • 嗯。我能想到的唯一另一件事就是摆弄配置,设置 self.locManager.desiredAccuracy = kCLLocationAccuracyBest;和 self.locManager.distanceFilter = kCLDistanceFilterNone;
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多