2014-10-20 35 views
5

Tôi đã đọc các câu hỏi và câu trả lời StackOverflow khác và hiểu đây là lỗi do iOS6 (hoặc theo thiết kế, phải phân phối lại đại biểu, sau đó xem, ai biết). Tôi không biết tại sao hoặc làm thế nào nó đã không được cố định.Rò rỉ bộ nhớ trong MapKit iOS8

Anywho, tôi đã thêm các bản sửa lỗi nóng từ câu trả lời khác (dưới đây, để độc giả trong tương lai):

- (void) viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [self applyMapViewMemoryHotFixOnDisappear]; 
} 

- (void)applyMapViewMemoryHotFixOnDisappear{ 
    [self applyMapViewMemoryHotFix]; 
    self.mapView.showsUserLocation = NO; 
    self.mapView.delegate = nil; 
    self.locationManager.delegate = nil; 
    [self.mapView removeFromSuperview]; 
    self.mapView = nil; 
} 

- (void)applyMapViewMemoryHotFix{ 
    switch (self.mapView.mapType) { 
     case MKMapTypeHybrid: 
     { 
      self.mapView.mapType = MKMapTypeStandard; 
     } 

      break; 
     case MKMapTypeStandard: 
     { 
      self.mapView.mapType = MKMapTypeHybrid; 
     } 

      break; 
     default: 
      break; 
    } 
    self.mapView.mapType = MKMapTypeStandard; 
} 

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [self applyMapViewMemoryHotFix]; 
} 

Tuy nhiên, câu hỏi tôi có được, tại sao bộ nhớ không giảm xuống trước khi mức MapKit ?

Memory Usage Before/After MapKit

Tôi còn thiếu điều gì khác không? Đây có phải là hành vi mong đợi không? Không có rò rỉ bộ nhớ đánh giá bởi profiler nhưng rõ ràng là một cái gì đó không đúng ...

+0

Tôi thấy như vậy. Tìm thấy giải pháp nào? – thejaz

+1

Không!Thành thật mà nói, thậm chí không áp dụng các 'hotfix' trên khu vực thay đổi. Các 'rò rỉ bộ nhớ' (nếu nó thậm chí là đó) là ok và không đáng chú ý trên một thiết bị thực sự, và nó không phát triển đó là tốt đẹp. – SparkyRobinson

+1

Đồng ý, tôi nhận thấy nó tốt hơn trên thiết bị nhiều hơn trong trình mô phỏng. – thejaz

Trả lời

1

Mặc dù việc sử dụng MemoryHotFix yêu quý của cộng đồng SO liên quan đến vấn đề này, bạn nên chắc chắn rằng bạn không nắm giữ bất kỳ tham chiếu mạnh mẽ. Như những người khác đã nói, nếu bạn đang sử dụng (đọc instantiating) quan điểm giữ một tham chiếu đến bộ điều khiển xem họ đang ở và cùng một bộ điều khiển xem như là một tham chiếu đến xem bạn có thể nhận được vào một chu kỳ tham khảo mạnh mẽ.

Tình huống như vậy có thể chặn các phương thức deinit/dealloc của bạn hiển thị các dọn dẹp không cần thiết và vô dụng.

Như đã nêu trong documentation:

Bạn giải quyết chu kỳ tài liệu tham khảo mạnh mẽ bằng cách định nghĩa một số các mối quan hệ giữa các lớp như tài liệu tham khảo yếu hoặc không có chủ thay vì tài liệu tham khảo như mạnh mẽ.

Vì vậy, hãy chắc chắn:

  1. Kiểm tra nếu deinit của bạn (nhanh chóng)/dealloc đang thực sự được gọi là (nếu không muốn nói, nó có thể chỉ ra một chu trình tham khảo Mạnh).
  2. Trên thực tế, các đại biểu của MKMapView và LocalitionManager cũng như chính họ.

Như thế này:

self.mapView.delegate = nil 
self.mapView = nil 
self.locationManager?.delegate = nil 
self.locationManager = nil 

Proof

Có ý nghĩ đó, đây là một ví dụ trong đó có một VC đẩy một VC với một MKMapView, mỗi dòng màu đỏ dọc có nghĩa là " đẩy VC mới "và mỗi đường màu xanh lục nghĩa là" popping it ":

enter image description here

Có một số thiết lập ban đầu (bắt đầu từ 50 Mb +/-), nhưng việc đẩy tương lai không gây ra bất kỳ rò rỉ bộ nhớ nào như được hiển thị. Điều đáng nói đến là điều này đã được chụp bằng cách sử dụng một thiết bị thực. Tôi đã thử nghiệm nó bằng cách sử dụng giả lập quá và kết quả được liên kết mặc dù thiết lập ban đầu là cao hơn nhiều (bắt đầu từ 100 Mb).

Hy vọng các bạn có thể sửa chữa nó và bạn cũng có thể kiểm tra dự án của mình cho Chu kỳ tham chiếu mạnh có thể ảnh hưởng đến sản phẩm của bạn trong tương lai;)