我有一個導航控制器,其中VC1將VC2壓入導航堆棧。 VC2在基於標籤的視圖中有一個MKMapView,用戶位置打開。當我使用Heapshot Analysis工具檢查儀器重複分配時,當我回到VC1時,我反覆查找一些MKUserLocation對象沒有被釋放。 MKMapView並沒有爲MKUserLocation釋放內存
我已經刪除了所有註釋,並在dealloc時禁用了用戶位置。這可能是堆增長的原因?
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
VC2 *vc2 = [[VC2 alloc] init];
vc2.index = indexPath.row;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[self navigationController] pushViewController:vc2
animated:YES];
[vc2 release];
vc2 = nil;
return nil;
}
的的dealloc代碼在VC2:
是推動VC2到導航堆棧VC1代碼
- (void)dealloc {
//Other UILabel, UITextField objects dealloc methods go here
//The next four lines of code do not make a difference even if they are in viewWillDisappear
[self.mapView removeAnnotations:self.mapView.annotations];
[self.mapView.layer removeAllAnimations];
self.mapView.showsUserLocation = NO;//This line does not make a difference in heapshot
mapView.delegate = nil;
[mapView release];
mapView = nil;
[super dealloc];
}
此外,不存在堆的增長,如果我不打開用戶位置。
更新:我已經在模擬器和iPad 3G + WiFi上測試了這一點,我發現這兩種情況下堆增長。
VC2中的dealloc真的被調用了嗎? – Anna 2012-01-05 17:29:02
是的,所有其他對象都被釋放。我通過取出另一個對象的dealloc來檢查它,並且它開始出現在heapshot中。 – 2012-01-05 17:54:17
你可以發佈VC2 dealloc方法和創建VC2的VC1中的代碼並推送它嗎?您是否嘗試過關閉用戶位置,並將地圖的代理設置爲無VC2的viewWillDisappear? – Anna 2012-01-05 18:08:07