ARC 与 MRC 下使用 CLLocationManager 定位注意事项
2014-04-06 20:54
204 查看
最近碰到几个朋友问一个关于定位的问题,他们发现很奇怪,在MRC下定位正常,但是在ARC下定位无效,抽空做了一番测试,分享出来,供大家参考,具体代码如下:
一,MRC 情况
1,创建定位对象,在viewDidLoad
2,实现代码方法,在代理中获取经纬度,同时显示在地图上
3,在模拟器下菜单Debug->Location->Apple 即可定位成功;
4,特别注意,在MRC下我们要遵循黄金法则,但是我们的对象manager没有释放,也没有自动释放,如果加了
二,ARC 情况
具体代码与MRC一样,但是却无法定位,好比加了 自动释放
故而建议将此变量manager 写成全局变量,代码
继续在MRC下,运行,代码改为
定位正常。
将工程转为ARC模式下,运行,也成功。
三,结合MRC和ARC,建议将此定位变量写成属性形式,即可定位均成功;
四,结论
MRC下写成局部变量,虽然能定位成功,但是却存在内存泄露的问题,在ARC下如果写成局部变量,虽然没有内存泄露,但是编译器却认为该变量在viewDidLoad 执行完成后可以抛弃,因为代理方法需要一段时间去执行,所以造成无法定位的奇怪现象,对于ARC,一定要注意RunLoop的每一次执行直接影响着AutoreleasePool的Drain,所以在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中,我们尽量用属性来修饰变量,以免一些内存不必要的提前释放,造成后续信息无法发送给对象,造成程序奔溃。
相关文章推荐
- 通过js对表单对象的便捷获取
- linux进程管理(4)---进程执行
- 让Source Insight支持ARM汇编.S文件关键字高亮,函数支持
- HDOJ2004成绩转换
- IO
- eclipse在线安装JBoss Tool过程
- mapreduce 操作 hbase
- eclipse在线安装JBoss Tool过程
- Androidi性能优化之Java代码优化(摘自Android性能优化一书)
- 二维数组的复制
- Http协议详解
- 使用R完成K近邻分类
- Android线程间通信的Message机制
- 电路交换和分组交换比较有什么好处?在电路交换中,TDM和FDM比较有什么好处?
- 体验常成员函数
- 手机免费使用wifi和ChinaNet详细图文教程
- html控件、html服务器控件和web用户控件(onclick,onclientclick和onserverclick的执行顺序)
- NYOJ-27 水池数目 DFS
- MicroDraw 控件读取AutoLisp设置的扩展属性
- 9条经典职场忠告:让80后少奋斗5年