16

Tôi là nhà phát triển mới sắp ra mắt ứng dụng đầu tiên của mình. Tôi đang bối rối về việc không dùng của viewDidUnload như mô tả dưới đây trong các ghi chú phát hành iOS 6 của Apple:iOS 6 không cho phép xemWillUnload & di chuyển đến didReceiveMemoryWarning

Trong iOS 6, các phương pháp viewWillUnload và viewDidUnload của UIViewController đang bị phản đối. Nếu bạn đang sử dụng các phương thức này để giải phóng dữ liệu, hãy sử dụng phương thức didReceiveMemoryWarning. Bạn cũng có thể sử dụng phương pháp này để giải phóng tham chiếu đến chế độ xem của chế độ xem nếu không được sử dụng. Bạn sẽ cần kiểm tra rằng chế độ xem không có trong cửa sổ trước khi thực hiện việc này.

Tại sao điều này xảy ra? Tôi nên làm theo hướng dẫn nào để đảm bảo rằng thay đổi này không gây ra bất kỳ sự cố về hiệu suất nào trong ứng dụng của tôi?

Cảm ơn.

+0

Thế nào là bạn hiện đang sử dụng viewDidUnload cho trong ứng dụng của bạn? –

Trả lời

17

Theo Apple, họ đã cải thiện việc quản lý bộ nhớ trong cho các chế độ xem đủ để đạt được các lợi ích bằng cách phá hủy nội dung trong viewWill/DidUnload là tối thiểu. Hơn nữa, họ có dữ liệu cho thấy rằng nhiều ứng dụng gặp sự cố do ứng dụng không xử lý đúng các thông báo đó và thực hiện các công cụ "khác" không liên quan đến việc tải chế độ xem.

Cuối cùng, cảnh báo bộ nhớ hiện đã được xác minh là cảnh báo đầu tiên và duy nhất bạn sẽ nhận được trước khi ứng dụng của bạn bị chấm dứt do bộ nhớ thấp, vì vậy nó thực sự là nơi xử lý các vấn đề về bộ nhớ.

Vì vậy, về cơ bản, chỉ cần xóa các phương thức viewWillUnloadviewDidUnload của bạn. Xử lý các sự cố bộ nhớ trong didReceiveMemoryWarning và bất kỳ trình quản lý bộ điều khiển chế độ xem nào khác ở những vị trí thích hợp.

EDIT

Tôi có thể hỏi: những "nơi thích hợp" là gì? Tôi đã từng sử dụng ViewdidUnload trong một số trường hợp nhất định mà chế độ xem [Sẽ/Đã] Biến mất là không hoàn toàn đầy đủ. Giống như tiếp tục đi xuống trên ngăn xếp điều khiển ngăn xếp. Bạn có muốn xây dựng thêm về điều đó không? - Dan1one

Điều đó tùy thuộc. Tôi biết đó không phải là điều bạn muốn nghe, nhưng đó là sự thật :-)

Nói chung, bạn nên tránh sự bất đối xứng. Vì vậy, bạn nên "hoàn tác" một hoạt động bằng cách sử dụng phương pháp đối xứng mà từ đó bạn "đã làm" bản gốc. Nói chung, bạn có thể thực hiện tất cả các công việc loại viewDidUnload trong didReceiveMemoryWarningdealloc.

Điều này thực sự không gây ra thay đổi, bởi vì bạn phải sao chép hầu hết mã đó ở cả hai nơi đó.

Tôi không biết ý bạn là gì bằng cách "tiếp tục xuống trên ngăn xếp bộ điều khiển điều hướng", vì vậy bạn cần làm rõ ví dụ đó để tôi cung cấp phản hồi hữu ích.

Một trong những vấn đề khi sử dụng viewDidDisappearviewDidAppear là rất khó để biết khi nào chế độ xem xuất hiện vì nó thực sự xuất hiện hoặc vì chế độ xem ở trên cùng đang biến mất ... .

Những mẩu API có nghĩa vụ phải giúp bạn giải quyết những vấn đề sau:

- (BOOL)isMovingFromParentViewController 
- (BOOL)isMovingToParentViewController 
- (BOOL)isBeingDismissed 
- (BOOL)isBeingPresented 
+0

Tôi có thể hỏi: "những địa điểm thích hợp" là gì? Tôi đã từng sử dụng ViewdidUnload trong một số tình huống nhất định, nơi chế độ xem [Will/Did] Disappear không hoàn toàn đầy đủ. Giống như tiếp tục đi xuống trên ngăn xếp bộ điều khiển điều hướng. Bạn có muốn xây dựng thêm về điều đó không? – Dan1one

+0

@ Dan1one: umm ... 'viewDidUnload' KHÔNG được gọi khi bị bật ra khỏi ngăn xếp hoặc trong hầu hết các trường hợp khác. Vì vậy, tôi không biết bạn đang làm gì – user102008

+0

Câu trả lời hay nhất tôi đã thấy trong nhiều tháng. Cảm ơn bạn! –

8

Trong iOS 6, quan điểm không bao giờ bốc dỡ.

Điều này có nghĩa là loadViewviewDidLoad chỉ được gọi một lần và viewDidUnload không bao giờ được gọi. Vì vậy, nếu bộ điều khiển chế độ xem của bạn sử dụng viewDidUnload để xử lý các điều kiện bộ nhớ thấp thì nó sẽ cần phải thay đổi.

Nếu bạn muốn phản hồi với điều kiện bộ nhớ thấp, hãy triển khai didReceiveMemoryWarning và giải phóng dữ liệu và đối tượng tạm thời của bạn theo phương pháp này.

6

Trong iOS 6 chúng ta nên phát hành lần xem bởi ourself, làm một cái gì đó như thế này

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    if([self isViewLoaded] && self.view.window == nil) 
    { 
     self.view = nil; 
    } 
} 
Các vấn đề liên quan