6

Ứng dụng của tôi, trong đó sử dụng ARC, không như sau:Giảm ký ức về UIImages từ máy ảnh sử dụng dụng cụ

  1. đăng một bức ảnh chụp bởi camera
  2. Nén hình ảnh để sử dụng như một hình thu nhỏ.
  3. Tôi làm điều này bằng [UIImage imageWithData: UIImageJPEGRepresentation (bản gốc, 0.1f)]
  4. tôi đặt tham khảo hình ảnh không nén để nil cho ARC để giải phóng bộ nhớ

Lặp đi lặp lại trình tự này sẽ có nghĩa là một vài nén hình thu nhỏ trên màn hình. Sau khoảng 7 hoặc 8 hình ảnh, ứng dụng bị lỗi do bộ nhớ thấp.

Trong Công cụ, tôi đang cố gắng sử dụng Phân bổ song song với Bộ nhớ Màn hình để tìm nguồn gốc của sự cố của tôi.

Một số số liệu thống kê cụ:

Allocation - Live Bytes nhảy khoảng 2 MB sau khi chụp ảnh, nhưng sau đó đi xuống bằng 1,5 MB sau khi tham khảo hình ảnh gốc được thiết lập để nil. Điều đó có vẻ là một điều tốt, nhưng ...

Đây là trạng thái cuối cùng của ứng dụng. #Living có vẻ rất cao so với Live Bytes, phải không?

Live Bytes #Living #Transitory Overall #Overall Bytes  
    3.72 MB 24538  80679  90.1 MB 105301 

Memory Monitor (theo dõi đầu kiểm tra) - Ứng dụng của tôi bắt đầu lên 7,5 MB và dùng một kết quả hình ảnh trong đó tăng ~ 13 MB. Đối với nhà nước mà tôi liệt kê ở trên, Memory Monitor cho biết rằng ứng dụng đang chiếm 72,67 MB của "Real Memory" và 123,79 MB bộ nhớ ảo.

Cho rằng Byte trực tiếp rất nhỏ, tôi biết tôi đang làm điều gì đó đúng. Tuy nhiên, vì dấu chân bộ nhớ ở những nơi khác lớn, tôi cũng chắc chắn rằng tôi đang làm điều gì đó rất sai. Bất kỳ ý tưởng gì đó có thể là gì, hoặc làm thế nào để theo dõi nó xuống?

+0

+1 cho câu hỏi hay. Làm thế nào bạn tải hình ảnh của bạn để hiển thị trên màn hình? Bạn đang sử dụng '[UIImage imageNamed:]'? – Rog

+1

Anh ta nói anh ta sử dụng camera. –

+0

Mục đích của dòng này là gì? [Hình ảnh UIImageWithData: UIImageJPEGĐại diện (ban đầu, 0.1f)] Bạn đang nén hình ảnh và sau đó giải nén ngay lập tức. Kết quả chỉ là một sự lãng phí chất lượng hình ảnh và thời gian CPU. –

Trả lời

2

Eitan27,

Đây không phải là một vấn đề ARC. Đây là về cách quản lý nhiều mục lớn trong bộ nhớ. iOS có một số cơ chế để giúp bạn ở đây. Nếu bạn ghi hình ảnh vào flash và sau đó mở lại nó như là dữ liệu được ánh xạ bộ nhớ, bạn sẽ chủ yếu giải quyết vấn đề của bạn. Làm sao? Hệ điều hành quản lý ánh xạ vào dấu chân bộ nhớ thường trú của bạn với dữ liệu không thay đổi được. Bởi vì những mục này là không thay đổi và, do đó, không bao giờ bẩn, sau đó nó có thể tuôn ra các trang được ánh xạ khi cần thiết. Nhược điểm của cơ chế này là số lượng giới hạn các bộ mô tả tập tin có sẵn cho mỗi ứng dụng.

Andrew

+0

Cảm ơn adonoho. Câu trả lời của bạn có vẻ tuyệt vời, mặc dù bạn đề cập đến một vài điều mà tôi hơi lạ. Tại sao có giới hạn về các bộ mô tả tệp? Bằng cách lưu vào flash, bạn có nghĩa là viết/lấy nó từ đĩa bằng tên tập tin? Hoặc là bạn nhiều hay ít gợi ý rằng tôi thực hiện một cái gì đó tương tự như một TileView/CATileLayer. – Eitan

+0

Eitan27, Mỗi ứng dụng có số lượng tệp giới hạn mà nó có thể mở bất kỳ lúc nào. Bộ mô tả tập tin là cấu trúc dữ liệu được phân phối bởi hệ điều hành. Thông thường, bạn chỉ có 30 hoặc hơn trong số này có sẵn. Bởi flash, tôi có nghĩa là lưu trữ liên tục của bạn. Vì bạn đang gặp vấn đề về không gian này, tôi cho rằng bạn đang chạy trên iOS. Tất cả các thiết bị iOS đều sử dụng RAM flash làm bộ nhớ liên tục. Andrew P.S. Đừng quên thưởng cho những người trả lời câu hỏi của bạn bằng dấu kiểm màu xanh lục lớn. – adonoho

+0

Tuyệt đối và có tôi đang chạy trên iOS. Tôi không rõ liệu giới hạn bộ mô tả tập tin có trên tổng số tệp hay các tệp đang được mở tại một thời điểm nhất định hay không. Dường như đây là vấn đề thứ hai và vấn đề sẽ được giải quyết bằng cách sử dụng CATileLayer để mở/hiển thị hình ảnh chỉ khi chúng cần thiết. – Eitan

0

Sử dụng một @autoreleasepool khối:

@autoreleasepool { 
    //code that inits the UIImage and sets it to nil 
} 

Xem ARC Cung cấp một Bản Tuyên Bố mới để quản lý autorelease Pools phần của Transitioning to ARC Release Notes

+0

Tôi không chắc chắn điều này áp dụng cho tôi. Hình ảnh được phân bổ, và sau đó một thể hiện của lớp người tải lên của tôi được đưa ra một tham chiếu đến hình ảnh và tải nó lên. Người tải lên sau đó đặt tham chiếu của nó thành không. Do đó, "init" của hình ảnh và "đặt nó thành không" xảy ra ở hai nơi khác nhau. – Eitan