【问题标题】:Memory leak when using CLLocationCoordinate2D使用 CLLocationCoordinate2D 时的内存泄漏
【发布时间】:2012-01-14 05:08:13
【问题描述】:

我正在使用 NSMutableArray 来保存 CLLocationCoordinate2D 值。测试了几分钟后,我发现应用程序崩溃了。我发现与数组和CLLocationCoordinate2D 值相关的严重内存泄漏。

代码如下:

NSMutableArray *arrayReturn = [[NSMutableArray alloc] init];
CLLocationCoordinate2D obj1 = CLLocationCoordinate2DMake(37.6085289,107.5941445);
CLLocationCoordinate2D obj2 = CLLocationCoordinate2DMake(27.1727738,78.041655);

[arrayReturn addObject:[NSValue valueWithBytes:&obj1  objCType:@encode(CLLocationCoordinate2D)]];
[arrayReturn addObject:[NSValue valueWithBytes:&obj2 objCType:@encode(CLLocationCoordinate2D)]];

return [arrayReturn autorelease];

我正在创建几个这样的对象并将其添加到数组中。尽管我在最后标记了一个自动释放,但我在数组中存在严重的内存泄漏。

我在这里做错了什么?

【问题讨论】:

  • 您的应用程序是如何崩溃的?它在哪里崩溃?你是如何确定你有内存泄漏的?

标签: iphone objective-c


【解决方案1】:

CLLocationCoordinate2D 是 2 个双精度值的简单结构,而不是 NSObject!

您在堆栈上分配 CLLocationCoordinate2D 并在 NSValue 对象中传递指向该数据的指针。但是方法返回后堆栈内存将不可用。这就是您的应用崩溃的原因。

您需要以某种方式将 CLLocationCoordinate2D 转换为 NSObjects。 比如这样:

NSArray* coords = [NSArray arrayWithObjects:[NSNumber numberWithDouble:obj1.latitude], [NSNumber numberWithDouble:obj1.longitude], nil];

【讨论】:

  • valueWithBytes:objCType: 创建一个 NSValue 对象,其中包含传递给它的内容的副本以及有关如何编码的信息。这个例程的重点是做他想做的事,将CLLocationCordinate2D转换为NSValue,它是NSObject的子类,可以毫无困难地放入NSArray。
  • @gaige 好吧,我不知道。感谢您的评论!
  • 我应该使用 free 释放每个 CLLocationCoordinate2D 地址吗??
  • 还有其他替代方法可以在数组中添加 CLLocationCoordinate 以便我可以解决这个问题..
  • 你可以使用一个简单的 C-Array
猜你喜欢
  • 2011-01-25
  • 2021-07-06
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多