12

Tôi hy vọng rằng sau khi tôi đẩy một bộ điều khiển xem thì tôi cần phải giải phóng quyền sở hữu của tôi đối với bộ điều khiển chế độ xem như tôi đã làm bên dưới.UINavigationController: Khi nào một chế độ xem được đẩy nhận được thông điệp Dealloc?

CustomViewController *nextViewController = [[CustomViewController alloc] initWithNibName:@"CustomView" bundle:nil]; 
[[self navigationController] pushViewController:nextViewController animated:YES]; 
[nextViewController release]; 

Sau khi tôi làm điều đó, tôi giả định rằng trình điều khiển điều hướng có quyền sở hữu đối tượng đó và sẽ phát hành khi thực hiện sau đó sẽ gọi dealloc trên customViewController của tôi. Tôi hy vọng điều đó sẽ xảy ra khi tôi chạm vào nút quay lại trên thanh điều hướng và chế độ xem không còn hiển thị nữa. Điều đó không xảy ra mặc dù. Tôi đã thêm một NSLog (@ "CustomViewController đã nhận dealloc") vào phương thức dealloc của CustomViewController nhưng nó không bao giờ được in. Đây có phải là hành vi bình thường không?

Bộ điều khiển điều hướng có đang thực hiện một việc gì đó giống như giữ đối tượng đó trong trường hợp cần thiết tại một thời điểm nào đó không? Nó sẽ thoát khỏi nó khi bộ nhớ bắt đầu cạn kiệt? Tôi đã cố gắng mô phỏng một cảnh báo bộ nhớ thấp nhưng không có gì xảy ra. Tôi có một cảm giác câu trả lời cho câu hỏi này sẽ là tôi chỉ nên không lo lắng quá nhiều và làm theo các thủ tục tiêu chuẩn để giữ lại/phát hành/autorelease. Điều đó nói rằng mặc dù, có bất kỳ ai khác delved vào này một chút nữa và tìm ra một câu trả lời tuyệt đối?

Trả lời

13

"Bộ điều khiển điều hướng chỉ làm việc gì đó giống như giữ đối tượng đó trong trường hợp nó cần ở một thời điểm nào đó?"

Yup. Đó là chính xác những gì nó đang làm. Nó sẽ gửi cho bạn viewDidLoadviewDidUnload tin nhắn. Và đó là nơi bạn nên phân bổ và tài nguyên miễn phí mà bộ điều khiển xem của bạn sử dụng.

Lưu ý rằng viewDidUnload sẽ chỉ được gọi khi hệ thống cho rằng cần phải giải phóng bộ nhớ.

Nếu bạn cần kiểm soát ngay lập tức khi mọi thứ được tải và giải phóng thì một nơi tốt hơn có thể là viewWillAppear:viewDidDisappear:.

Phương pháp phân bổ/init của tôi cho các bộ điều khiển xem thường khá trống hoặc không có ở đó.

+2

Theo tài liệu, viewDidUnload chỉ được gửi trong trường hợp thiết bị của bạn đã nhập các điều kiện bộ nhớ thấp. Không có bất kỳ dấu hiệu nào cho thấy viewDidUnload liên quan đến deallocation. – Giao

+0

Dĩ nhiên bạn đúng. Cập nhật câu trả lời của tôi :-) –

+0

Điều đó sẽ trả về nhiều hơn? 1) Phương thức dealloc bên trong viewconroller của tôi là gì? 2) Bộ điều khiển điều hướng chỉ đợi cho đến khi nó nhận được một số loại tín hiệu để cuối cùng thoát khỏi bộ điều khiển xem cũ? 3) Nếu có đến # 2 thì tín hiệu gì? Tôi đặt một thông báo nslog vào phương thức cảnh báo bộ nhớ đã nhận của tôi trong lớp điều khiển xem của tôi và sau khi đẩy và popping nhiều lần sau đó mô phỏng một cảnh báo bộ nhớ tôi nhận được N tin nhắn trên bàn điều khiển. Điều đó nói với tôi tất cả các đối tượng vẫn còn đó và cảnh báo bộ nhớ đã không làm cho họ để có được deallocated như thông điệp tường trình trong thông điệp dealloc không in. – startoftext

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