iPhone Help: Нечетная утечка памяти в CoreLocation Framework - PullRequest
1 голос
/ 24 августа 2009

Я работал над устранением утечек памяти в моей программе, и я дошел до нескольких отставших. Странно то, что они приходят, когда я использую CoreLocation, чтобы получить местоположение GPS. Код правильно возвращает местоположение, но он протекает повсюду: CFHTTPMessage, CFURLConnection, CFURLRequest, CFURLResponse, GeneralBlock-16, -32, -48, HTTPRequest и т. Д. Кто-нибудь может подсказать, как это исправить?

Инициализация MyCLController

locationController = [[MyCLController alloc] init];
locationController.delegate = self;
[locationController.locationManager startUpdatingLocation];

Сделайте некоторые вещи и перезвоните через делегата:

[locationController release];

MyCLController.h:

#import <Foundation/Foundation.h>
@protocol MyCLControllerDelegate 
@required
- (void)locationUpdate:(CLLocation *)location;
- (void)locationError:(NSError *)error;
@end
@interface MyCLController : NSObject  {
    CLLocationManager *locationManager;
    id delegate;
}
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, assign) id  delegate;

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation;

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error;
@end

MyCLController.m:

#import "MyCLController.h"
@implementation MyCLController
@synthesize locationManager;
@synthesize delegate;

- (id) init {
    self = [super init];
    if (self != nil) {
        self.locationManager = [[[CLLocationManager alloc] init] autorelease];
        self.locationManager.delegate = self; // send loc updates to myself
    }
    return self;
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    [locationManager stopUpdatingLocation];

    [self.delegate locationUpdate:newLocation];
}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    [self.delegate locationError:error];
}
- (void)dealloc {
    [super dealloc];
}
@end

Ответы [ 2 ]

3 голосов
/ 17 июля 2010

Вам необходимо освободить LocationManager. Убедитесь, что вы установили его делегат в NULL перед выпуском. Кроме того, не стоит просто возвращать первый результат. Убедитесь, что горизонтальная точность не <0, а также ниже некоторого порога, например 5000 метров. И чтобы сделать его более надежным, вы можете добавить таймер, чтобы он останавливался через определенный промежуток времени, если он не может найти ваше местоположение достаточно точно. </p>

1 голос
/ 24 августа 2009

вы никогда не выпускаете locationController

...