2011-03-22 33 views
3

我稍微MKMultiPoint类的以下属性points在MapKit困惑:返回一个C-阵列和存储器管理

@property (nonatomic, readonly) MKMapPoint *points 

它返回结构的阵列。用pointCount属性可以知道数组中元素的数量。因为调用者负责分配内存然后释放内存,所以我一直认为C数组只能是“返回的”类型。

如果我要写一个类似的属性,谁会为数组分配内存(可能是被调用者),更重要的是谁会释放它(可能是调用者)?这听起来有点危险。此外,上述财产的文件没有说明需要释放内存。

我缺少什么?

回答

0

在大多数情况下,接收器将处理分配内存。谁释放它取决于你如何确定所有权。接收器分配的内存返回后不再需要吗?如果是这样,你应该在你的文档中注意到调用者需要释放返回的数组。如果接收器可以重新使用返回的内存,请将其重新分配给它。

如果你想离开它被调用来处理内存分配,你可能不会使用属性,而是选择一个消息和财产,像这样:

- (NSUInteger) mapPointCount; 
- (void) getMapPoints:(MKMapPoint *)pointsOut; 

,即发送者应提供一个现有的缓冲区,用于存储obj.mapPointCount数量的MKMapPoints。然后,您已将责任分配给调用方。

如果您不想走这条路线,并且由于接收器无法保留/释放/自动释放有问题的内存,我会留给主叫方以释放它。如果你想清楚地表明内存不会被释放,请使用const MKMapPoint *这个类型的文件来注意它,它以某种形式的文档(它应该很清楚地表明内存不是由谁访问的数据)。

或者,将其存储在NSData或其他东西,并明确指出,一旦下一个autorelease池被耗尽,指针是无效的。但是,这有点不友善,并且可能对垃圾回收并不安全。最后一点可能是错的,但我不知道说什么,所以我现在宁愿谨慎。

+0

嗨@nil,谢谢您的回答,强调文件在该特定情况下的重要性。我假设苹果公司的文档中对'MKMultiPoint'这个'points'属性缺少一些东西。鉴于该方法的签名,我没有看到任何其他选项,调用者释放内存。否则,他们会是一个泄漏,对吧? – ptrico 2011-03-22 07:31:04

+0

我不知道,但我的假设是说,如果没有关于它的说明,该对象拥有指针并将处理重新分配。如果事实证明是泄漏,你可以稍后尝试释放它,看看是否会阻止它 - 更好地假设它不是泄漏(因为你可以通过一些简单的测试来检测这个[如果它是一个])比写一些似乎运行良好的东西,然后一个月后,所有地狱都会因为这个“你没有怀疑的免费(......)”而变得松散。 – nil 2011-03-22 07:47:32

+0

我现在意识到,在完全误解了这个问题的同时,我完全写了这个问题的答案。这可能没有任何帮助。 – nil 2011-03-22 07:49:00

3

(示例代码是C)。

好的做法是在同一级别分配和释放资源。有两种方法来定义返回的东西数组的函数:

// `points` are allocated and freed by the caller. 
void MakePoints (MKMapPoint *points, size_t number_of_points); 

// usage: 
size_t count = 10; 
MKMapPoint *points = malloc (sizeof (MKMapPoint) * 10); 
MakePoints (points, count); 

// Use points 

free (points); 

// or simply 
MKMapPoint points[10]; 
MakePoints (points, 10); 

// Use points 

第二种方法是让库函数管理内存:

MKMapPoint *MakePoints (size_t number_of_points); 
void FreePoints (MKMapPoint *points); 

// Usage: 
MKMapPoint *points = MakePoints (10); 

// Use points 

// The library need not necessarily call free() on points, 
// it might reuse it in further calls to MakePoints(). 
FreePoints (points); 
+0

嗨@Vijay马修,谢谢你的回答。我明白你的两个例子,但他们似乎不符合我给的那个。在MKMultiPoint属性中,该数组被返回,而不是在参数中传递。这迫使接收者分配内存,而不是调用者分配属性的情况。至于第二个例子,文档没有提到返回数组的“空闲内存”函数。是否暗示调用者应该用free()C函数释放内存? – ptrico 2011-03-22 07:25:00