CLLocationManager从不调用委托方法

pax*_*axx 6 iphone objective-c cllocationmanager ios4 ios

嗨,我正在玩iPhone上的位置,从一开始我遇到了问题.我已经解决了我的问题,并确定这CLLocationManager是困扰我的.

所以我开发了非常简单的应用.我只有一个带有a的视图控制器CLLocationManager.在视图上加载我初始化CLLocationManager并开始更新.我也实现了两个方法didFailWithErrordidUpdateToLocation.

我已经阅读了很多问题以及我学到了什么,所以这就是这个.您必须CLLocationManager在初始化期间保留.此外,它是明智的设置CLLocationManagers delegate,以nil卸载的过程中view(用的东西传递到信息办CLLocationManager,因为框架保留它,它从来没有正确地释放)

总而言之,我无法找到关于如何做以及如何使其发挥作用的合理解释.

这是我的代码,所以如果有人能搞清楚,我会很感激. viewControllers头文件

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface CoreLocationViewController : UIViewController <CLLocationManagerDelegate>
{
    CLLocationManager *locManager;
}

@property (nonatomic, retain) CLLocationManager *locManager;

@end
Run Code Online (Sandbox Code Playgroud)

viewController .m文件

#import "CoreLocationViewController.h"


@implementation CoreLocationViewController
@synthesize locManager;

- (void)viewDidLoad 
{
    [super viewDidLoad];

    self.locManager = [[CLLocationManager alloc] init];
    locManager.delegate = self;
    [self.locManager startUpdatingLocation];

    self.view.backgroundColor = [UIColor grayColor];
}

#pragma mark -
#pragma mark Location Delegate

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
        NSLog(@"in fail with error");
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"in update to location");
}


#pragma mark -
#pragma mark Memory Management

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload 
{
self.locManager.delegate = nil;
    [super viewDidUnload];
}


- (void)dealloc 
{
    [locManager release];
        [super dealloc];
}


@end
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我使用的是iOS 4.2.我指出这一点是因为我读到Apple已经改变了iOS 4中的位置代表

Bùi*_*Hải 20

就我而言,由于线程问题,委托永远不会被调用

  • 操作LocationManager的线程必须设置NSRunLoop
  • 如果你使用主线程,你已经有一个runloop,现在你只需要实例化管理器并在主线程上使用它

阅读本文以了解有关CLLocationManagerDelegate的更多信息

  • 完美的。为我修好了。我之前已经尝试过这一点,但只确保了“startUpdatingLocation”方法。实际上,alloc/init 等也必须在主线程上! (2认同)

Mar*_*ass 8

此外,在iOS8中,你必须有两件额外的东西:

  • 在Info.plist中添加一个密钥,并向位置管理员请求授权以启动它.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • 您需要请求相应位置方法的授权.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

代码示例:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)

资料来源:http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/


pax*_*axx 3

所以我设法找到了一个错误。这是在内存管理中。在我的应用程序委托文件中,我初始化了 aCoreLocationViewController并将其添加subview到我的窗口中,之后我释放了它,一切都很好。但是,发布部分并不是一个好方法。在我释放我的方法后ViewControllerdealloc方法被调用并释放locationManager

因此,正确的做法是不要释放ViewController持有的a locationManager,或寻找另一种处理方式。我不太确定为什么这是一个问题,因为我认为将 a 添加ViewController到窗口后它会被保留,因此它localtionManager也会被保留。如果有人能为我解决这个问题,我将不胜感激。