2012-09-19 25 views
23

Tôi đang cố gắng tìm một lỗ hổng bộ nhớ khác trong mã của mình và tôi dường như không thể tìm ra dữ liệu CG Raster là gì. Trong khi đi qua VM Tracker với các snapshot tự động được kích hoạt, CG Raster Data dường như là phần duy nhất tăng lên. Chúng cũng tăng đều đặn mà không có sự phân bổ tăng lên.Dữ liệu CG Raster là gì?

Tôi không hoàn toàn chắc chắn dữ liệu CG Raster là gì, cũng như cách khắc phục sự cố, nhưng tại thời điểm này, dấu chân ngày càng tăng gây ra lỗi bộ nhớ và sự cố, vì vậy nó không tốt! Tôi làm văn bản của riêng tôi rendering (sử dụng CoreText), vì vậy tôi nghĩ rằng có cái gì để làm với nó. Tôi cũng đang tải hình ảnh?

Dưới đây là hình ảnh của những dấu chân: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

UPDATE: "NSConcreteGlyphGenerator" Vấn đề này vẫn còn, nhưng điều thú vị đủ tôi có thể liên quan đến nó một sự rò rỉ trong UIFoundations một cái gì đó gọi là Nó dường như chỉ xảy ra khi tôi gọi một phương thức "boundingRectWithSize:" trên một chuỗi được gán trong phương thức CoreText mà thực sự rút ra. Điểm mấu, cụ thể, là:

[displayString boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:0 context:nil]; 

Dần dần theo dõi nó xuống ...

+4

Bạn đã bao giờ Tôi có vấn đề này vẫn còn trong iOS 7. – Daniel

+0

Mọi cập nhật về điều này? @Daniel –

Trả lời

1

Đây không phải là nhiều của một câu trả lời, nhưng chỉ để ai đó có được cuộc điều tra bắt đầu ...

Tôi nghĩ Dữ liệu CG Raster mới với iOS 6, nhưng đã có mặt trong iOS 5 dưới dạng CG Image. Tôi đã thử nghiệm trên cả hai trình mô phỏng và trên iOS 5, CG Raster Data không có mặt, nhưng nếu bạn so sánh tổng số tiền trên iOS 6 và iOS 5, CG Image chỉ bằng CG Raster Data và CG Image không hiển thị trên iOS 6. Vì vậy, tôi khá chắc chắn họ chỉ đổi tên thành CG Image thành CG Raster Data.

Đối với những gì CG Image thực sự là, tôi đã cố gắng tìm ra điều đó trong nhiều tháng. Tôi nghĩ rằng nó chỉ là xem những thứ liên quan đến bố cục mà bạn không thực sự kiểm soát, bởi vì ứng dụng của tôi không có bất kỳ UIImages hoặc CG Images nào, và bộ nhớ hình ảnh CG của tôi khá cao, với Core Animation và bố cục xem.

+0

“Hình ảnh CG” vẫn còn hiện diện là iOS 6, ít nhất là trong ứng dụng của tôi. –

+0

Ya, cho tôi nữa, mặc dù dấu vết cực nhỏ của nó .. trong khi ở iOS 5 nó là khoảng 20 mb, trong iOS 6 tối đa 32 kb của nó. Vì vậy, bất cứ hình ảnh CG nào, nó không đóng vai trò lớn trong iOS 6 – Snowman

12

Tôi không biết mọi thứ “dữ liệu raster CG” có thể chứa, nhưng một điều tôi biết chắc chắn nó chứa là ... bộ nhớ được cấp bởi Core Graphics để lưu trữ dữ liệu raster, còn gọi là bitmap.

Cụ thể, trong ứng dụng của mình, tôi tạo hai ngữ cảnh bitmap 256x256 bằng cách sử dụng CGBitmapContextCreate. Tôi vượt qua NULL làm thông số data, do đó Đồ họa cốt lõi cấp phát bộ nhớ bitmap cho tôi. Một bitmap 256x256 với 32 bit (4 byte) mỗi pixel mất 256 KiB = 64 trang của 4 KiB mỗi. Trong Công cụ, tôi nhận được hai khối “dữ liệu raster CG” mỗi trang 65 trang. Nếu tôi nhận xét một trong những bối cảnh bitmap đó, tôi chỉ nhận được một khối dữ liệu “raster dữ liệu CG” 65 trang trong Dụng cụ.

Mặt khác, tôi cũng có một số CATiledLayer trong ứng dụng của mình. Các CATiledLayer thiết lập bối cảnh đồ họa riêng của mình để tôi vẽ vào và tôi tin rằng nó tạo ra những bối cảnh đó bằng bộ nhớ dùng chung mà máy chủ cửa sổ (springboard trên iOS 5, backboard trên iOS 6) cũng truy cập trực tiếp. Tôi không thấy bất kỳ khối “dữ liệu raster CG” nào tương ứng với các bối cảnh đồ họa đó.

0

Nếu bạn lo lắng về việc sử dụng bộ nhớ (89MB) là một chút. Bạn đã thử mô phỏng cảnh báo bộ nhớ trong Simulator (Simulator> Hardware> Simulate Memory Warning) chưa?

Tôi đoán là bộ nhớ của nó đang được sử dụng hết bởi hình ảnh.

Rất có thể bạn có thể cần phải deallocate hình ảnh của bạn bằng cách quan sát các thông điệp cảnh báo bộ nhớ:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

Xóa tất cả đối tượng hình ảnh của bạn trong handleMemoryWarning phương pháp.

+0

làm thế nào để xóa tất cả hình ảnh? có nghĩa là 'image = nil'? hoặc 'self.view = nil'? – aircraft

2

Tôi đã gặp vấn đề tương tự với bộ nhớ dữ liệu CG Raster tăng lên bằng cách đơn giản nhấn và mở trình điều khiển chế độ xem nhiều lần. Tôi đã dành một lúc nghĩ rằng đó là một vấn đề với một số mã vẽ. Cuối cùng tôi đã theo dõi nó xuống một đại biểu không tham chiếu yếu đến bộ điều khiển xem đang được đẩy và xuất hiện, vì vậy khi tôi bật trình điều khiển chế độ xem, nó không bị xử lý. Dữ liệu Raster CG xảy ra là phần lớn nhất trong dấu chân của bộ điều khiển của khung nhìn, vì vậy tôi đã nhầm lẫn với vấn đề ban đầu, khi nó thực sự là bộ điều khiển khung nhìn không được phát hành (do đó, không giải phóng quan điểm của nó, một số có dữ liệu CG Raster).

Tóm lại: nếu bạn thấy rò rỉ bộ nhớ với dữ liệu CG Raster, hãy xem bộ điều khiển chế độ xem có thể có lượt xem với chúng và đảm bảo rằng chúng đang được giải phóng.

0

Không thực sự là câu trả lời. Nhưng một số gợi ý nữa mà tôi đã tìm ra trong khi giải quyết của tôi CG-raster-dữ liệu bị rò rỉ:

  • các cg-raster dữ liệu giữ ký ức về CGIMageRefs (ít nhất là tạo ra từ CGBitmapContextCreateImage() từ một bối cảnh được tạo ra bởi CGBitmapContextCreate (NULL, ...)
  • rò rỉ của tôi là thiếu CGImageRelease() .Tôi đã sử dụng hình ảnh để chuyển nội dung của một CALayer và giả định rằng thuộc tính này giữ tham chiếu. Nhưng dường như nhiệm vụ này sao chép hình ảnh. ít nhất tôi không có vấn đề gì khi gọi CGImageRelease ngay sau khi chuyển nhượng.

Hy vọng rằng sẽ giúp ai đó ...

1

Khi tôi gặp sự cố với điều này, "Dữ liệu Raster CG" xuất phát từ một hình ảnh tôi đã tạo từ một cuộc gọi đến UIGraphicsGetImageFromCurrentImageContext từ trong một UIGraphicsBeginImageContextWithOptions. Nó đã cho tôi một ngày để theo dõi vấn đề, và cuối cùng nó không liên quan đến cách hình ảnh được thực hiện ở tất cả. Trong trường hợp của tôi, tôi đã vô tình dán hình ảnh vào một NSCache của riêng tôi trong một phần khác của mã, không nhận ra nó.

Nếu bạn đang gặp sự cố với dữ liệu CG Raster không được phát hành, bạn nên xem xét nguồn dữ liệu được tạo có thể không liên quan gì đến vấn đề thực. Có thể dữ liệu hình ảnh chỉ đơn giản là được giữ lại khi bạn không mong đợi, và nhãn "Dữ liệu Raster CG" mà bạn thấy trong Công cụ chỉ đề cập đến nơi dữ liệu bắt nguồn. Bạn nên kiểm tra để đảm bảo rằng bạn không làm gì đó giống như nhiều addSubviews trong khi không removeFromSuperview (với UIImageViews chẳng hạn) hoặc đưa hình ảnh vào bộ nhớ cache, mảng, biến số mạnh, v.v.

+0

Tôi dường như đang gặp sự cố tương tự. Bạn có thể giải thích vấn đề với việc đặt một hình ảnh vào một NSCache không? – Kenneth