2011-11-05 38 views
9

Tôi đã tạo ứng dụng nhằm hiển thị một số lớp phủ. Các lớp phủ ở dạng đa giác với tối đa 10000 điểm ở vòng ngoài. Nhưng số lượng điểm cao dường như không phải là vấn đề ở đây. Trong vài ngày qua, tôi đã đơn giản hóa ứng dụng của mình chỉ để tìm bản thân mình bằng Chế độ xem đơn giản chứa MapView. Xem được tải từ một xib (với các cửa hàng và đại biểu kết nối). Lớp phủ được tạo trong phương thức - (void) mapView: (MKMapView *) mapView regionDidChangeAnimated: (BOOL) hoạt hình và được thêm vào mapView.iOS 5 Lỗi MapKit với Lớp phủ khi zoom/pan

Trình diễn (có sẵn tại đây https://github.com/nebucaz/mapkit) hiển thị MapView và thêm hình tam giác màu đỏ bất cứ khi nào bản đồ được phóng to/thu nhỏ hoặc được quét. Khi chơi xung quanh phóng to và panning (mạnh và nhanh) MapView, ứng dụng bị treo. Thật dễ dàng để chars mô phỏng, trên thiết bị nó là khó khăn hơn nhiều mặc dù nó có thể (tôi có thể cung cấp sụp đổ-đăng nhập).

Có hai bản demo: MapCrash và MapCrashStatic. Việc đầu tiên tạo ra nhiều đa giác xung quanh bản đồ tùy thuộc vào nơi một chảo/zoom. Thứ hai chỉ có một, đa giác tĩnh duy nhất mà được tạo ra trong - (void) viewDidLoad và sau đó được thêm vào mỗi cuộc gọi của MapView regionDidChangeAnimated

App luôn treo với vết lùi sau:

Attaching to process 8745. 
MapCrash(8745) malloc: protecting edges 
[Switching to process 8745 thread 0x1820b] 
[Switching to process 8745 thread 0x1820b] 
(gdb) backtrace 
#0 0x00000000 in ??() 
#1 0x00e81a60 in CG::Path::apply_transform() 
#2 0x00ed741c in CGPathCreateMutableCopyByTransformingPath() 
#3 0x00f50d23 in CGContextAddPath() 
#4 0x000f11dc in MKRoadWidthAtZoomScale() 
#5 0x000ee498 in MKMapRectRemainder() 
#6 0x000fab01 in MKTilesRequireGoogleLegalNotices() 
#7 0x02723c17 in -[CALayer drawInContext:]() 
#8 0x027407e3 in tiled_layer_render() 
#9 0x0265b127 in CAImageProviderThread() 
#10 0x01eb04e6 in _dispatch_worker_thread2() 
#11 0x98f44b24 in _pthread_wqthread() 
#12 0x98f466fe in start_wqthread() 
(gdb) 

các vết lùi là luôn luôn giống nhau, nó treo tại cùng một điểm trong mã thư viện. Tôi đã phân tích với các công cụ (zombie, rò rỉ, phân bổ) và cũng đã thực hiện một số thử nghiệm với các đối tượng bị giữ lại quá mức. Tôi cho rằng đó là vấn đề về trí nhớ nhưng tôi vẫn chưa thể bắt đầu bảo vệ Malloc. Sự cố có thể được sao chép trên nhiều máy - thậm chí khó khăn, tôi chỉ cài đặt lại các công cụ Xcode.

Các bài đăng khác trên stackoverflow.com cũng xử lý sự cố đột ngột trong MapKit, nhưng không cung cấp giải pháp trực tiếp cho vấn đề của tôi hoặc phải đối phó với đại biểu và các vấn đề bắt đầu/chuyển đổi ứng dụng khác. ARC đã tắt trong các dự án của tôi.

tôi săn tai nạn này trong hơn một tuần nay, vẫn giả định rằng tôi hiểu sai các KMLViewer Demo (Apple) hoặc làm điều gì đó sai (Tín dụng cho các nhà phát triển iOS khác trong khu phố của tôi!)

Tuy nhiên, tôi sẽ đánh giá cao các đề xuất và trợ giúp của bạn trong vấn đề này.

+2

Chỉ để kêu vang với vài xu giá trị của tôi, tôi hiện có chính xác cùng một vấn đề. Tôi có một NSMutableArray chứa một danh sách các đối tượng hỗ trợ giao thức MKOverlay.Nếu một đối tượng trong mảng có thể thay đổi được xóa, nó cũng bị loại bỏ khỏi mapview. Tuy nhiên khi tôi thu phóng liên tục, dấu vết ngăn xếp sau xảy ra: – Diziet

+1

'Không thể truy cập bộ nhớ tại địa chỉ 0x1 (gdb) trong đó # 0 0x00000001 in ??() # 1 0x011a741c trong CGPathCreateMutableCopyByTransformingPath() # 2 0x01220d23 trong CGContextAddPath() # 3 0x003be3e1 trong MKMapRectRemainder() # 4 0x003be498 trong MKMapRectRemainder() # 5 0x003cab01 trong MKTilesRequireGoogleLegalNotices() # 6 0x029f3c17 trong - [CALayer drawInContext:]() # 7 0x02a107e3 trong tiled_layer_render() # 8 0x0292b127 trong CAImageProviderThread() # 9 0x021804e6 trong _dispatch_worker_thread2() # 10 0x9c981b24 trong _pthread_wqthread() # 11 0x9c9836fe trong start_wqthread() ' – Diziet

+2

Cảm ơn @ Diziet chia sẻ. Tôi đã mở một TSI tại Apple Developer Network tuần trước và sau đó được yêu cầu gửi một lỗi. Tôi đã nói rằng không có cách giải quyết nào có sẵn tại thời điểm này và rằng lỗi sẽ được điều tra. Tôi sẽ đăng thêm ý kiến ​​về tiến bộ. – Snel

Trả lời

3

Có thể bạn đã nghĩ về điều này, nhưng tôi đã thấy rất nhiều máy dò tìm riêng biệt từ MapKit tất cả đều xuất phát từ việc không đưa ra đại biểu. Chỉ cần đảm bảo rằng bạn đã đặt đại biểu của chế độ xem bản đồ thành 0 trước khi bạn phát hành nó.

Ngoài ra, tôi đã thấy một số nhà phát triển có xu hướng sử dụng performSelector: afterDelay: trên chế độ xem bản đồ của họ. Đó là tốt miễn là bạn đặt một cuộc gọi hủy ở đúng nơi quá.

+0

Xe tăng @David để chia sẻ suy nghĩ của bạn. Trong ví dụ của tôi, tôi thực sự đã quên đặt đại biểu của mapView thành 0 trước khi phát hành. Tôi chưa bao giờ nghĩ về điều này, bởi vì bản đồ bị treo khi đang được sử dụng và vẽ bản đồ. Tôi đã cập nhật ví dụ với 'self.theMapView.delegate = nil; [self.theMapView release]; self.theMapView = nil; 'Mã ví dụ không bao giờ thực hiện' performSelector'. Hiện tại, sự cố vẫn tiếp diễn. – Snel

0

xóa phương thức zoomToPolyLine và sử dụng mapViewDidUpdateLocation để phóng to trên nhiều dòng.