【发布时间】:2011-04-01 22:29:48
【问题描述】:
我正在实现一个 CLLocationManager 权限,如几个教程中所述。
在 LocationManager 收到第二次更新之前一切正常。然后发生内存泄漏。
仪器告诉我,泄露的对象是 NSCFTimer、GeneralBlock-16 和 NSCFSet
有什么想法吗?
感谢您的帮助
[编辑]
在反复启动和停止 locationManager 之后,更新似乎来得更快。这让我觉得每次位置更新发生时 CLLocationManager 都会初始化一个新的计时器......很奇怪......
而且 - 所以你不需要阅读我的评论 - 应用会在一段时间后崩溃
[编辑]
好的 - 我不明白这里有一些代码......
我正在为 locationManager 使用一个单独的类,如下所述:http://www.vellios.com/2010/08/16/core-location-gps-tutorial/
locationManager.h
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@protocol locationManagerDelegate
@required
- (void)locationUpdate:(CLLocation *)location;
- (void)locationError:(NSError *)error;
@end
@interface locationManager : NSObject <CLLocationManagerDelegate>{
CLLocationManager *myLocationManager;
id delegate;
CLLocation *bestEffortAtLocation;
BOOL outOfRange;
}
@property (nonatomic, retain) CLLocationManager *myLocationManager;
@property (nonatomic, retain) CLLocation *bestEffortAtLocation;
@property (nonatomic, assign) id delegate;
@property (nonatomic, assign) BOOL outOfRange;
@end
locationManager.m
#import "locationManager.h"
@implementation locationManager
@synthesize myLocationManager;
@synthesize delegate;
@synthesize bestEffortAtLocation;
@synthesize outOfRange;
- (id) init {
self = [super init];
NSLog(@"initializing CLLocationManager");
if (self != nil) {
outOfRange = NO;
self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
self.myLocationManager.delegate = self;
self.myLocationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
[self performSelector:@selector(stopUpdatingLocation:) withObject:@"Timed Out" afterDelay:100.0];
}else{
NSLog(@"Location Manager could not be initialized");
}
return self;
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if(outOfRange == NO){
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil];
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) return;
// test that the horizontal accuracy does not indicate an invalid measurement
if (newLocation.horizontalAccuracy < 0) return;
[self.delegate locationUpdate:newLocation];
}else{
[self.myLocationManager stopUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"error!!!!");
[self.myLocationManager stopUpdatingLocation];
[self.delegate locationError:error];
}
- (void)dealloc {
[myLocationManager release];
[bestEffortAtLocation release];
[super dealloc];
}
@end
然后,在我调用的主类中:
mainFile.h(摘录)
#import "locationManager.h"
@interface mainFile : UIViewController <locationManagerDelegate , UIAlertViewDelegate>{
locationManager *locationController;
CLLocation *myLocation;
}
@end
mainFile.m(摘录)
#import "locationManager.h"
@implementation mainFile
@synthesize locationController;
@synthesize myLocation;
- (void)locationError:(NSError *)error{
// Do alert-Stuff
}
- (void)locationUpdate:(CLLocation *)location {
// Do location-Stuff
}
- (void)viewDidLoad
{
[super viewDidLoad];
locationController = [[[locationManager alloc] init] autorelease];
locationController.delegate = self;
[locationController.myLocationManager startUpdatingLocation];
}
- (void)dealloc {
self.locationController = nil;
[locationController release];
}
@end
这让我有点发疯:)
【问题讨论】:
-
应用程序是否崩溃,比如说,每次 100 秒?因为它应该是因为您正在向未实现该消息的方法的对象发送延迟消息。它也应该随机崩溃,因为你释放了位置管理器,但你仍然保持对它的引用。
-
@Swissdude 有解决这个问题的办法吗?
-
那么,这是真正的内存泄漏吗?位置框架?还是在您的代码中?
标签: iphone memory-leaks cllocationmanager