2009-08-24 1 views
1

私のプログラムでメモリリークを解消するために取り組んできましたが、私はいくつかの落とし穴に倒れています。奇妙なことは、CoreLocationを使用してGPSの場所を取得したときから来ているということです。 CFHTTPMessage、CFURLConnection、CFURLRequest、CFURLResponse、GeneralBlock-16、-32、-48、HTTPRequestなどのコードが適切に返されています。 MyCLControlleriPhoneヘルプ:CoreLocation Frameworkで奇妙なメモリリークが発生する

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 

答えて

3

を解放することはありません。解放する前にデリゲートをNULLに設定してください。また、最初の結果を返すのは良い考えではありません。水平精度が<ではなく、また5000メートルのようないくつかの閾値以下であることを確認してください。また、より堅牢なものにするために、タイマーを追加して、正確な場所を見つけられない場合は、一定時間後にタイマーを停止することもできます。

+0

これは便利です。 – JonLeah

1

あなたがLocationManagerを解放する必要がlocationController

+0

答えてくれてありがとうございますが、実際は漏れがどこから来たのか分からないので、私は自分のdeallocメソッドを投稿するのを忘れていました。 startUpdatingLocationを呼び出すと、リークが発生します。 [locationController release]; – JonLeah

関連する問題