2015-02-20 16 views
5

Tôi đã làm theo lời khuyên có sẵn trong một số SO câu hỏi, như this one, để giải phóng MKMapView từ bộ nhớ - Mã của tôi dưới đâyMKMapView bộ nhớ phát hành

- (void)viewDidDisappear:(BOOL)animated { 

    [super viewDidDisappear:animated]; 

    self.map.mapType = MKMapTypeHybrid; 
    self.map.showsUserLocation = NO; 
    self.map.delegate = nil; 
    [self.map removeFromSuperview]; 
    self.map = nil; 

    self.locationManager.delegate = nil; 
} 

Một phần, nó hoạt động, nhưng không hoàn toàn. Hãy để tôi cung cấp một số dữ liệu.

Dưới đây là bản ghi phân bổ bộ nhớ từ Công cụ.

enter image description here

Hai lá cờ đỏ (thế hệ) chỉ ra các trạng thái trước khi tôi hiển thị MKMapView trong một bộ điều khiển xem phương thức và sau khi tôi đã bác bỏ nó. MKMapView dường như bị deallocated. Ví dụ: nếu tôi lọc Ngăn xếp thống kê trong Công cụ cho MKMapView, đối tượng thực sự xuất hiện khi chế độ xem phương thức được trình bày và biến mất sau khi được đóng. Tuy nhiên, khi loại bỏ chế độ xem bản đồ, tôi vẫn có hơn 30 MB bộ nhớ chưa được giải phóng.

Dữ liệu thế hệ B (cờ đỏ thứ hai) cho thấy có một số lượng lớn đối tượng (và không phải đối tượng) đang giữ bộ nhớ này.

enter image description here

Khi tôi nhìn vào chi tiết mở rộng của một trong những trường hợp đó, nó thường cho thấy một dấu vết ngăn xếp có tính năng các lớp học tin rằng, tôi đoán, có liên quan đến bản đồ vẽ enter image description here

Có ai biết làm thế nào để giải phóng tất cả dữ liệu đó? Có một số bộ nhớ cache tôi có thể/nên sạch?

+0

bạn đã quản lý để giải quyết vấn đề này chưa? – azimov

+0

Thật không may, chưa .. – artooras

+0

Có may mắn trong việc xóa bộ nhớ không? – sridvijay

Trả lời

1

Trong ứng dụng của tôi, sử dụng bộ điều khiển chế độ xem bản đồ dưới sự kiểm soát của bộ điều khiển chế độ xem tab, tôi lưu trữ tham chiếu đến một MKMapView trong biến tĩnh và sử dụng cùng một lần xem bản đồ này thay vì phân bổ một cái mới ViewDidLoad mỗi lần. My (một phần) mã:

@implementation PubMapViewController { 
    NSMutableArray *annotations; 
} 
static MKMapView *_mapView = nil; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (!_mapView) { 
     _mapView = [[MKMapView alloc] init]; // frame set up with constraints 
    } else { 
     [_mapView removeAnnotations:_mapView.annotations]; // precaution 
    } 
    [_mapViewProxy addSubview:_mapView]; 
    [self addConstraints:_mapView]; 
    [self configureView:((PubTabBarController *)self.tabBarController).detailItem]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [_mapView addAnnotations:annotations]; 
    if (annotations.count == 1) { 
     [_mapView selectAnnotation:annotations[0] animated:YES]; 
    } 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [_mapView removeAnnotations:_mapView.annotations]; 
} 

Ở đây, configureView: bộ lên bản đồ cho self.tabBarController.detailItem, đặt đại biểu và các cửa hàng của mình các chú thích bản đồ trong biến annotations.

Bản đồ được tạo thành một chế độ xem phụ cho một chế độ xem được xác định trong trình tạo giao diện (biến mẫu @property (weak, nonatomic) IBOutlet UIView *mapViewProxy;). Bản đồ phải có cùng kích thước như mapViewProxy và khi tôi sử dụng tính năng tự động hoàn tất, kích thước khung hình _mapView được kiểm soát hoàn toàn bằng các ràng buộc được thiết lập trong (trên cùng, dưới cùng, bên trái và bên phải bằng _mapView.superview).

Tôi thấy bắt buộc phải xóa chú thích khỏi bản đồ trong viewDidDisppear: và thêm lại chúng vào viewDidAppear. Nó thậm chí có thể sạch hơn để bỏ đặt _mapView.delegate trong viewDidDisppear: và đặt lại trong viewDidAppear.

BTW: Biến tĩnh _mapView vẫn còn gây hiểu lầm mang dấu gạch dưới hàng đầu vì đó là biến mẫu trước khi được thiết lập bằng cách xác định MKMapView trong IB.

0

Đây là giải pháp mà tôi đã sử dụng và nó hoạt động tốt. Tôi nghĩ rằng vấn đề này chỉ được giới thiệu gần đây bởi vì tôi chưa gặp vấn đề gì với Bản đồ deallocating đúng trước khi trong cùng một dự án.

Tôi đã lưu bản sao của bản đồ trong một singleton và chỉ cần kiểm tra sự tồn tại của bản đồ trước khi tạo một bản đồ mới. tức là:

if let existingMapView = LocationSingleton.sharedInstance.singletonMapView { 

    //Display map 
}else{ 

    let newMapView = //Instantiate new map view controller 
    LocationSingleton.sharedInstance.singletonMapView = newMapView 

    //Display map 
} 
Các vấn đề liên quan