ARC 与 MRC 下使用 CLLocationManager 定位注意事项

来源:互联网 发布:osi网络七层协议 编辑:程序博客网 时间:2024/04/30 15:11

最近碰到几个朋友问一个关于定位的问题,他们发现很奇怪,在MRC下定位正常,但是在ARC下定位无效,抽空做了一番测试,分享出来,供大家参考,具体代码如下:

一,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中,我们尽量用属性来修饰变量,以免一些内存不必要的提前释放,造成后续信息无法发送给对象,造成程序奔溃。


1 0
原创粉丝点击