pax*_*axx 6 iphone objective-c cllocationmanager ios4 ios
嗨,我正在玩iPhone上的位置,从一开始我遇到了问题.我已经解决了我的问题,并确定这CLLocationManager是困扰我的.
所以我开发了非常简单的应用.我只有一个带有a的视图控制器CLLocationManager.在视图上加载我初始化CLLocationManager并开始更新.我也实现了两个方法didFailWithError和didUpdateToLocation.
我已经阅读了很多问题以及我学到了什么,所以这就是这个.您必须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
就我而言,由于线程问题,委托永远不会被调用
阅读本文以了解有关CLLocationManagerDelegate的更多信息
此外,在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/
所以我设法找到了一个错误。这是在内存管理中。在我的应用程序委托文件中,我初始化了 aCoreLocationViewController并将其添加subview到我的窗口中,之后我释放了它,一切都很好。但是,发布部分并不是一个好方法。在我释放我的方法后ViewController,dealloc方法被调用并释放locationManager。
因此,正确的做法是不要释放ViewController持有的a locationManager,或寻找另一种处理方式。我不太确定为什么这是一个问题,因为我认为将 a 添加ViewController到窗口后它会被保留,因此它localtionManager也会被保留。如果有人能为我解决这个问题,我将不胜感激。
| 归档时间: |
|
| 查看次数: |
11946 次 |
| 最近记录: |