2010-02-14 27 views
20

tôi có xu hướng để phát hành công cụ của tôi trong -dealloc, và bây giờ iPhone OS 3.0 giới thiệu phương pháp này -viewDidUnload funny, nơi họ nói:Chính xác tôi phải làm gì trong viewDidUnload?

// Thả bất kỳ subviews của giao diện chính giữ lại. // ví dụ. self.myOutlet = nil;

So -viewDidUnload dường như được gọi khi chế độ xem bộ điều khiển chế độ xem đã được khởi động khỏi bộ nhớ. Và nếu tôi có subviews gắn vào quan điểm chính của bộ điều khiển xem, tôi phải phát hành những thứ đó chỉ ở đây, nhưng không phải trong -dealloc là tốt?

Điều đó thật khó hiểu. Ngoài ra, điều gì sẽ xảy ra nếu --ealloc khiến cho khung nhìn được dỡ bỏ (được phát hành)? Sau đó, một lần nữa, nó sẽ gọi -viewDidUnload?

Tôi nhận ra sự khác biệt, rằng -viewDidUnload chỉ dành cho trường hợp chính chế độ xem bị giết nhưng bộ điều khiển chế độ xem vẫn nằm trong bộ nhớ. Và -dealloc là cho trường hợp toàn bộ điều đi vào thùng rác.

Có thể ai đó có thể xóa bỏ sự nhầm lẫn.

+1

Câu hỏi tương tự: http://stackoverflow.com/questions/1158788/when-should-i-release-objects-in-voidviewdidunload-rather-than-in-dealloc –

+0

viewDidUnload không được chấp nhận trong iOS 6! – whyoz

Trả lời

37

Mục đích ở đây là "cân bằng" quản lý chế độ xem phụ của bạn. Mọi thứ bạn tạo trong viewDidLoad sẽ được phát hành theo số viewDidUnload. Điều này giúp bạn dễ dàng theo dõi những gì nên được phát hành ở đâu. Trong hầu hết các trường hợp, phương pháp dealloc của bạn là hình ảnh phản chiếu của phương pháp initviewDidUnload của bạn sẽ là hình ảnh phản chiếu của phương pháp viewDidLoad của bạn.

Như bạn đã chỉ ra, các phương pháp viewDid ... sẽ được sử dụng khi chính chế độ xem được tải và không tải. Điều này cho phép một mô hình sử dụng trong đó bộ điều khiển xem vẫn nạp vào bộ nhớ, nhưng quan điểm riêng của mình có thể được nạp và bốc dỡ theo yêu cầu:

init 
viewDidLoad 
viewDidUnload 
viewDidLoad 
viewDidUnload 
... 
dealloc 

Tất nhiên, nó không làm tổn thương để giải phóng những thứ trong phương pháp dealloc của bạn như tốt, miễn là bạn đặt chúng thành nil khi bạn thả chúng trong viewDidUnload.

Các trích dẫn sau đây từ phần Quản lý bộ nhớ của Apple UIViewController documentation, mô tả nó một cách chi tiết hơn:

... trong iPhone OS 3.0 và sau đó, phương pháp viewDidUnload có thể là một nơi thích hợp hơn đối với hầu hết nhu cầu .

Khi cảnh báo bộ nhớ thấp xảy ra, lớp UIViewController sẽ xóa các chế độ xem nếu nó biết rằng nó có thể tải lại hoặc tạo lại chúng sau này. Nếu điều này xảy ra, nó cũng gọi phương thức viewDidUnload để cho phép mã của bạn có thể từ bỏ quyền sở hữu của bất kỳ đối tượng nào được liên kết với cấu trúc phân cấp của bạn, bao gồm các đối tượng được tải với tệp nib, đối tượng được tạo trong phương thức viewDidLoad của bạn và các đối tượng được tạo lười biếng thời gian chạy và được thêm vào phân cấp chế độ xem. Thông thường, nếu bộ điều khiển xem của bạn chứa các cửa hàng (thuộc tính hoặc biến thô chứa từ khóa IBOutlet), bạn nên sử dụng phương thức viewDidUnload để từ bỏ quyền sở hữu các cửa hàng đó hoặc bất kỳ dữ liệu liên quan đến chế độ xem nào khác mà bạn không còn cần nữa.

+0

viewDidUnload không phải là một bản sao của viewDidLoad vì phương thức Unload đặt các cửa hàng thành không. –

+1

Bạn đang đề cập đến phương pháp nào của Unload? Tôi đã xem qua tài liệu UIViewController, nhưng tôi không tìm thấy một phương thức với tên đó. Khi tôi mô tả viewDidUnload như là (thường) một hình ảnh phản chiếu của viewDidLoad, tôi có nghĩa là về quản lý bộ nhớ; tức là: bất kỳ thứ gì được phân bổ, sao chép hoặc giữ lại trong viewDidLoad sẽ được phát hành trong viewDidUnload. IBOutlets thường được cấu hình tự động khi tệp nib của bạn được tải, vì vậy ngay cả khi chúng được đặt thành 0 trước cuộc gọi tới viewDidUnload, điều đó sẽ không ảnh hưởng đến bất cứ điều gì từ quan điểm bộ nhớ. –

+0

Để rõ ràng; Tôi có thể thấy làm thế nào nó sẽ được * có thể * để chạy vào rắc rối nếu bạn đã phân bổ một đối tượng trong viewDidLoad mà sẽ trở thành không thể tiếp cận trong viewDidUnload khi tất cả các IBOutlets đã được thiết lập để nil. Tuy nhiên, đây sẽ là một dấu hiệu mạnh về thiết kế xấu, vì một đối tượng nên luôn duy trì một con trỏ tới bất kỳ bộ nhớ nào mà nó có trách nhiệm giải phóng. –

3

Khi bạn nói viewDidUnload sẽ được gọi nếu self.view = nil, điều này thường xảy ra nếu bạn nhận được cảnh báo bộ nhớ. Trong phương pháp này, bạn phải phát hành bất kỳ subview của mainview mà có thể dễ dàng được tạo ra bởi .xib hoặc loadView phương pháp.Bạn nên phát hành bất kỳ đối tượng dữ liệu nào nếu bạn tạo chúng trong viewDidload hoặc loadView, vv vì các phương thức này sẽ được gọi lại để hiển thị chế độ xem cho người dùng, những dữ liệu đó có thể được tái tạo dễ dàng.

0

Khi bạn nhận được cảnh báo bộ nhớ thường thì trình điều khiển xem sẽ dỡ bỏ chế độ xem của nó nhưng chính nó sẽ không bị dealloc.
Tất cả những thứ có thể được tạo lại dễ dàng nên được dỡ xuống, nhưng không phải là mô hình của chế độ xem.

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