如何在没有内存泄漏的类中存储位置(CLLocationCoordinate2D)?
Posted
技术标签:
【中文标题】如何在没有内存泄漏的类中存储位置(CLLocationCoordinate2D)?【英文标题】:How to store a location (CLLocationCoordinate2D) inside a class w/o leaking memory? 【发布时间】:2011-01-25 04:13:26 【问题描述】:我正在创建一个库,其中包含一个 API,用于根据 GPS 收集的一些值设置当前位置。我想将此位置存储在我的班级中,然后更改我的库的行为(如果已设置)。
我的想法是:
@interface myLib
@property (nonatomic, retain) CLLocationCoordinate2D *location;
@implementation myLib
@synthesize location = _location;
- (void)setLocation:(CLLocationCoordinate2D *)loc
location = loc;
- (void)someFunc
if (location != nil) ...
但是,对于 CLLocationCoordinate2D 对象,retain 不是有效属性。
那么,保存 CLLocationCoordinate2D 以供以后使用而不浪费内存的正确方法是什么?
【问题讨论】:
【参考方案1】:CLLocationCoordinate2D
是非对象类型。它不是从NSObject
继承的,所以它不能是retain
ed。所以像这样声明你的实例变量
CLLocationCoordinate2D location;
属性声明如下:
@property (nonatomic, assign) CLLocationCoordinate2D location;
然后你的setLocation:
方法很简单:
- (void)setLocation:(CLLocationCoordinate2D)newLocation
location = newLocation;
// other stuff
这个setLocation:
方法也是可选的,因为综合属性将为您分配。但是,当分配了新位置时,您似乎想做一些其他的事情,所以这应该可以让您这样做。
【讨论】:
啊,是的,好 pt,忘记它不是 NSObject - 编译器应该知道这一点,我想知道他是否收到警告并想知道编译器在这里做了什么。【参考方案2】:@synthesize 将为您生成 getter 和 setter。
因此这是多余的 - (void)setLocation:(CLLocationCoordinate2D *)loc 位置 = 位置;
技术上是错误的,因为那是“分配”二传手,而不是“保留”二传手。
这就是我猜泄漏发生的地方
【讨论】:
这是一个简化的例子,实际的集合调用也做了一个快速的数学运算。匹配的@property 字符串是什么?以上是关于如何在没有内存泄漏的类中存储位置(CLLocationCoordinate2D)?的主要内容,如果未能解决你的问题,请参考以下文章