2010-02-04 38 views
1

要更新MapView的一個GPS指示燈的位置...iPhone mapView/mapKit使用removeAnnotation&addAnnotation導致內存泄漏?

[mapView removeAnnotation:myGpsAnnotation]; 
[myGpsAnnotation release]; 
myGpsAnnotation = nil; 
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS]; 
[mapView addAnnotation:myGpsAnnotation]; 

...我看到網內存在儀器(模擬器)緩慢攀升。沒有「泄漏」點,但「網絡字節」和「#網」緩慢遞增......除非此代碼被註釋掉。所以我100%肯定這是違規代碼。

,但如果我這樣做了以下...

[mapView removeAnnotation:myGpsAnnotation]; 
[myGpsAnnotation release]; 
myGpsAnnotation = nil; 
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS]; 
[mapView addAnnotation:myGpsAnnotation]; 
[mapView removeAnnotation:myGpsAnnotation]; 
[mapView addAnnotation:myGpsAnnotation]; 
[mapView removeAnnotation:myGpsAnnotation]; 
[mapView addAnnotation:myGpsAnnotation]; 

...那麼「網絡字節」和「#網」更快增加。有沒有可能這不是我的錯誤,我試圖追蹤MapKit中的泄漏?我真的在泄漏記憶嗎?再次,「泄漏」下沒有任何內容出現,但是我不明白爲什麼Net值會不斷攀升。

感謝您的任何幫助,--God

+0

我很感興趣,你如何能夠做到這一點,請如果你有一個代碼的和平可以粘貼它,就像我們也可以學習THX很多幫助我們...... – user482611 2011-01-22 14:37:57

回答

0

如果你在模擬器上測試時觀察這個,不要擔心。看起來,地圖工具包在設備上模擬器上運行時緩存了內存中的地圖圖塊,它使用SQLite存儲地圖圖塊,而不是設備上的有限RAM。

1

您應該首先了解集合是如何工作的。

添加和收集對象將保留它。
從集合中刪除對象將釋放它。

你的情況,這是一個地圖視圖:


  1. 添加註釋到地圖視圖後,如果您擁有的參考,你應該釋放它。
  2. 從地圖視圖中刪除註釋後,不需要釋放它。

MyClass *obj=[[MClass alloc] init]; 
[mapview addObject:obj]; 
[obj release]; 
... 
[mapview removeAnnotation:obj]; 

就是這樣。沒有必要在這裏發佈。

2

你的發佈週期是錯誤的:

myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS]; 
//retain count = 1 

[mapView addAnnotation:myGpsAnnotation]; 
//retain count = 2 (the map does an extra retain) 

[myGpsAnnotation release]; 
//retain count = 1 
myGpsAnnotation = nil; //not really necessary 

[mapView removeAnnotation:myGpsAnnotation]; 
//retain count = 0 -> dump (you can do this on the original place; I put it here to show the cycle) 

PS。您看到的內存增加可能來自注釋VIEWS。這些由地圖緩存。如果您仍然看到mem增加,那麼您的視圖dequeueing可能是錯誤的。

PPS。你是否考慮過爲註釋設置新的位置?如果位置是唯一發生變化的地方,則更容易。

myGpsAnnotation.coordinate = region.center;