2011-11-07 37 views
5

Tôi đang cố gắng tuân thủ các nguyên tắc của Apple về việc đáp ứng các cảnh báo bộ nhớ thấp trong ứng dụng của tôi. Các hướng dẫn nói: "Khi nhận được (cảnh báo bộ nhớ thấp), ứng dụng của bạn phải giải phóng bộ nhớ càng nhiều càng tốt bằng cách giải phóng các đối tượng không cần hoặc xóa bộ nhớ cache mà nó có thể tạo lại sau".iOS 5 + ARC - không gán con trỏ cho con trỏ để giải phóng bộ nhớ?

Câu hỏi đặt ra là cách 'giải phóng' bộ nhớ, sử dụng ARC?

Ví dụ: giả sử tôi có hình ảnh trong cấu trúc phân cấp chế độ xem của chế độ xem không có trên màn hình. Trong didReceiveMemoryWarning, tôi hiện đang xóa nó khỏi khung nhìn bằng cách gọi removeFromSuperview, nhưng tôi vẫn có một con trỏ tới chính UIImage. Tôi có nên cố gắng giải phóng bộ nhớ này không? Làm sao? Bằng cách gán nil cho con trỏ?

TIA: John

+0

Vui lòng cung cấp thêm thông tin về con trỏ. Nó có phải là một ngà, địa phương trong một phương pháp, toàn cầu, tài sản? – zaph

+0

Vâng những cái mà tôi đang nghĩ đến là các biến cá thể UIImage *. – John

+0

Được rồi, tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình bằng cách sử dụng tham chiếu yếu cho subview và 2) gán con trỏ cho con trỏ nếu khung nhìn vẫn còn xung quanh khi didReceiveMemeoryWarning được thực hiện (mỗi lần tôi thấy nó trong trình gỡ lỗi) . Chủ yếu, tôi nghĩ rằng tôi chỉ nhận ra rằng bạn không thể tránh cảnh báo bộ nhớ tất cả các thời gian ... đôi khi chúng được gây ra bởi các ứng dụng khác. Bạn chỉ cần xử lý chúng đúng cách. Sau khi sửa bộ xử lý cảnh báo bộ nhớ của mình, tôi chỉ nhận được cảnh báo một lần, thay vì mỗi khi tôi kích hoạt UIImagePickerController. Một cải tiến lớn. – John

Trả lời

3
  1. Vào thời điểm bạn nhận được -didReceiveMemoryWarning, tầm nhìn của bạn nên đã được phát hành tự động bởi hệ thống và -viewDidUnload nên được gọi. Vì vậy, nếu bạn không giữ tham chiếu đến các bản xem trước của chế độ xem, bạn không chịu trách nhiệm giải phóng chúng.

  2. Nếu không, bạn có thể tham chiếu đến một số tài nguyên mà bạn muốn giải phóng, bạn chỉ cần hủy tham chiếu bằng cách gán "nil" cho chúng cho NSObject s và gọi các hàm phát hành tương ứng cho các loại tham chiếu khác, ví dụ: CFRelease cho các đối tượng Core Foundation.

+0

H'mmm ... vấn đề là, tôi giữ một tham chiếu đến một số bản xem trước, vì ứng dụng cần có khả năng sửa đổi hoặc xóa các bản xem phụ, như là một phần của hoạt động bình thường của ứng dụng. Thật dễ dàng để có thể nói [self.mySubView removeFromSuperview] khi tôi cần thay vì duyệt qua cây con mỗi khi tôi cần xóa/sửa đổi một chế độ xem phụ. Nhưng tôi đoán điều đó có nghĩa là hệ thống không thể phát hành chế độ xem phụ, ngay cả khi chế độ xem được phát hành. Subview sẽ được phát hành đúng cách nếu tôi có một liên kết yếu với nó? – John

+1

Chắc chắn, bạn có thể sử dụng '__weak', hoặc đơn giản bạn có thể đặt nó thành' nil' trong '-viewDidUnload'. – an0

+0

Trong chế độ xem iOS6DidUnload không còn được gọi tự động nữa. Bạn cần sử dụng didReceiveMemoryWarning. – bkbeachlabs

0

Làm cho tất cả IBOutlet thuộc tính với thuộc tính strong.

Đặt tất cả IBOutlet thuộc tính tất cả thành nil trong viewDidUnload.

+2

@John được hỏi cụ thể về ARC. Giữ lại và giải phóng không còn được sử dụng nữa. – Undeadlegion

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