2009-03-20 31 views
9

Cần lời khuyên về cách gỡ lỗi này. Tôi mới với môi trường hạn chế và không có kinh nghiệm lập trình điện thoại nhúng hoặc thông minh trước đây nên tôi có thể sử dụng một số manh mối. Đã nhận thức được: Công cụ, Phân tích tĩnh Clanger, xem xét thủ công mã, vv Công cụ dường như rất hữu ích nói chung nhưng khá tốn thời gian và đóng băng rất nhiều thời gian! Clanger cũng đã giúp tôi rất nhiều. Có vẻ như tôi chỉ tiêu thụ quá nhiều bộ nhớ nói chung và tôi tự hỏi chiến lược tốt là gì. Tôi có phát hành một số đối tượng cấp cao nhất không? Có một 'chiến lược ưa thích' không?Cách tiếp cận tốt nhất để gỡ lỗi ứng dụngDidReceiveMemoryWarning trên iPhone?

Chỉ cần tự hỏi liệu có ai đã giải quyết vấn đề này thành công hay không và liệu họ có đề xuất nào khác không? Cảm ơn tất cả.

Trả lời

2

Về cơ bản bạn nhận được cảnh báo này bởi vì (không ngạc nhiên) iPhone là bộ nhớ nguy hiểm thấp. Điều này thường có thể là một trong hai lý do;

  1. Bạn bị rò rỉ bộ nhớ.
  2. Bạn đang phân bổ quá nhiều đối tượng và cần phải truy cập lại thiết kế của bạn.

Đầu tiên, bạn nên chạy các công cụ và kiểm tra phân bổ bộ nhớ của mình. Điều này thực sự có thể làm chậm ứng dụng của bạn (và yêu cầu bộ nhớ bổ sung) vì vậy hãy thử kiểm tra từng khu vực của ứng dụng của bạn. Ví dụ. nếu bạn có nhiều lượt xem chuyển đổi giữa chúng một vài lần.

Thứ hai, bạn sẽ phải kiểm tra những gì bạn đang làm có thể dẫn đến phân bổ bộ nhớ lớn. Ví dụ: nếu bạn đang viết trình duyệt Flickr, bạn có thể cần phải giảm số lượng hình ảnh bạn đã tải bất cứ lúc nào hoặc giải phóng một số hình ảnh không sử dụng khi bạn nhận được cảnh báo này.

Đây là những quy tắc chung duy nhất tôi có thể đề xuất mà không cần biết thêm về ứng dụng của bạn.

Thật không may là không có cách nào thực sự (mà tôi biết) để có được số liệu phân bổ bộ nhớ hiện tại từ hệ điều hành iPhone. Điều này làm cho nó thực sự khó khăn để cô lập các khu vực của ứng dụng của bạn mà vô tình nhớ bộ nhớ.

+1

3. Bạn phải đối phó với mạng xml/hình ảnh/dữ liệu không thể tải tất cả vào bộ nhớ cùng một lúc (như máy tính để bàn) và phải được xử lý thành từng phần nhỏ hơn – slf

+0

Về ý tưởng cho thiết kế tốt hơn , ví dụ về Sách SQLite trong tài liệu của Apple mô tả một chiến lược hydrat hoá/mất nước. Readme cung cấp một giải thích tuyệt vời về khái niệm và có các đối tượng dữ liệu thực hiện mẫu này. – hyuan

5

Có rất nhiều bài viết hay về quản lý bộ nhớ trong ứng dụng iPhone. Dưới đây là một số liên kết hữu ích.

Những điều bạn nên nói chung chăm sóc

  1. phát hành bất kỳ biến mà bạn không cần
  2. Luôn xử lý didReceiveMemoryWarning và phát hành bất kỳ biến không sử dụng
  3. Dừng bất kỳ quy trình ký ức nặng trong applicationDidReceiveMemoryWarning như chơi audio/video, UIImagePickerController vv

EDIT này không áp dụng nữa. imageNamed: có vấn đề về bộ nhớ đệm trước phiên bản 3.x OS.Vấn đề không tồn tại nữa và bạn nên sử dụng imageNamed: (làm cho màn hình hiển thị võng mạc dễ dàng hơn)

  1. KHÔNG sử dụng imageNamed: để tạo đối tượng UIImage.
+0

Tôi biết điều này là cũ, nhưng chỉ cần tự hỏi tại sao số 4 ở trên? Có gì sai khi sử dụng imageNamed? – ferdil

+3

imageNamed: điểm không áp dụng ngay bây giờ. Trước 3.x, imageNamed được sử dụng để lưu trữ hình ảnh làm tăng bộ nhớ được ứng dụng sử dụng. Họ đã cải thiện nó rất nhiều. Vì vậy, với 3.x trở lên, bạn có thể sử dụng phương pháp này. – lostInTransit

Các vấn đề liên quan