ARCとMRCでCLLocationManagerを使用した位置決めに関する注意事項

2063 ワード

最近何人かの友达に位置付けについての质问に出会って、彼らはとてもおかしいことを発见して、MRCの下で位置付けは正常で、しかしARCの下で位置付けは无効で、时间を割いて1回のテストをして、分かち合って、みんなの参考に供して、具体的なコードは以下の通りです:
一、MRC状況
1、位置決めオブジェクトを作成し、viewDidLoad
CLLocationManager *manager = [[CLLocationManager alloc] init];
    manager.desiredAccuracy = kCLLocationAccuracyBest;
    manager.distanceFilter = 5;
    manager.delegate = self;
    [manager startUpdatingLocation];

2,コードメソッドを実装し,エージェントで緯度を取得し,同時に地図に表示する.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation* location = [locations lastObject];
    CLLocationCoordinate2D coordinate = location.coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
    MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span);
    [self.myMap setRegion:region animated:YES];
}

3、シミュレータの下でメニューDebug->Location->Appleを位置決めできます.
4、特に注意して、MRCの下で私达は黄金の法则に従いますが、私达の対象managerは釈放していませんて、自动的に釈放していませんて、もしプラスしたら
[manager autorelease]; , ;

二、ARC状況
具体的なコードはMRCと同じですが、自動リリースを追加したように位置決めできません.
したがって、この変数managerをグローバル変数、コードに書くことをお勧めします.
@interface ViewController ()<CLLocationManagerDelegate>
{
    CLLocationManager *manager;
}

引き続きMRCで実行し、コードを
 manager = [[CLLocationManager alloc] init];

位置が正常です.
プロジェクトをARCモードに変更し、実行し、成功しました.
三、MRCとARCを結合して、この位置決め変数を属性形式に書くことを提案して、位置決めはすべて成功することができます;
@property (nonatomic,strong) CLLocationManager *manager;

四、結論
MRCではローカル変数と書いてあり、位置決めは成功するもののメモリリークの問題があり、ARCではローカル変数と書くとメモリリークはないものの、コンパイラはこの変数をviewDidLoadの実行完了後に捨てることができると考えている.エージェントメソッドはしばらく実行する必要があるため、位置決めができない奇妙な現象をもたらす.ARCに対しては、RunLoopの実行はAutoreleasePoolのDrainに直接影響するので、ARCでは、メモリの不要な早期解放を避けるために、できるだけ属性で変数を修飾し、後続の情報がオブジェクトに送信されず、プログラムがクラッシュしないように注意してください.