【问题标题】:How to store a location (CLLocationCoordinate2D) inside a class w/o leaking memory?如何在没有内存泄漏的类中存储位置(CLLocationCoordinate2D)?
【发布时间】: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 以供以后使用而不浪费内存的正确方法是什么?

【问题讨论】:

    标签: iphone objective-c location


    【解决方案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 字符串是什么?
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2014-08-26
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多