如何在没有内存泄漏的类中存储位置(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 继承的,所以它不能是retained。所以像这样声明你的实例变量

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)?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免内部类中的内存泄漏

java内存溢出的问题如何排查

Crypto++ RSAES 类中的内存泄漏

ThreadLocal内存泄漏实验

通过 Java 中的内存转储缓解凭证泄漏

内存泄漏/溢出