2011-03-22 44 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