2009-02-23 28 views
24

Tôi đang sử dụng UINavigationController để di chuyển giữa các giao diện. Khi tôi di chuyển qua lại trong chế độ xem, bộ nhớ được ứng dụng của tôi sử dụng tiếp tục tăng lên. Khi đặt các câu lệnh NSLog trong phương thức dealloc của tất cả các trình điều khiển xem, tôi nhận thấy nó đã được gọi chỉ cho một số trình điều khiển xem và không phải tất cả những gì đã được xuất hiện.iPhone - khi nào là dealloc cho một bộ điều khiển xem được gọi là?

Ví dụ, đây là chuỗi trong đó quan điểm được đẩy MainViewController -> viewcontroller1 -> viewcontroller2 -> viewcontroller3

Bây giờ trong viewcontroller3 nếu tôi làm một popToViewController: mainController, dealloc được gọi là chỉ dành cho viewcontroller3. Nó không được gọi cho viewcontroller1 và 2.

Ai đó có thể cho tôi biết lý do tại sao điều này xảy ra.

Đã tìm thấy sự cố. Phương thức dealloc không được gọi nếu bất kỳ tham chiếu nào được giữ bởi một viewcontroller vẫn còn trong bộ nhớ. Trong trường hợp của tôi, nó là đối tượng MPMoviePlayerController không được phát hành trong viewcontroller1 và viewcontroller2.

+0

Tôi gặp chính xác cùng một vấn đề; dealloc được gọi chỉ cho bộ điều khiển thứ 3. Bạn nói "Phương thức dealloc không được gọi nếu bất kỳ tham chiếu nào được giữ bởi một viewcontroller vẫn còn trong bộ nhớ." bạn có thể xây dựng trên này? –

+1

Bộ điều khiển xem là một đại biểu của một đối tượng vẫn đang được sử dụng. Tôi đã xóa nó khỏi làm đại biểu và sau đó nó hoạt động tốt. Đã không nhận được dealloced kể từ khi đối tượng khác tổ chức tham chiếu của nó (như là đại biểu) – lostInTransit

Trả lời

13

Đây là trường hợp cuối cùng, trước hết. Vì vậy, nếu bạn tưởng tượng bộ điều khiển xem đầu tiên của bạn là bun dưới cùng của một burger, sau đó bạn thêm burger (bộ điều khiển xem thứ hai) và sau đó là burger trên cùng (bộ điều khiển xem thứ ba).

Nếu bạn quay trở lại bánh mì kẹp thịt bạn cất cánh bánh đầu (popViewController: gọi phương thức dealloc của chế độ xem được bật). Nếu bạn muốn quay trở lại bun dưới cùng thì bạn phải bật burger (dealloc được gọi mỗi khi view được bật).

không chắc chắn lý do tại sao trên pop để nhổ tận gốc dealloc quan điểm điều khiển thứ hai sẽ không được gọi là mặc dù ..

hmm

+0

Cảm ơn Dan. Đó là điều làm tôi ngạc nhiên khi dealloc được gọi cho một số lớp và không cho những người khác. Bạn có biết bất kỳ tình huống nào khi điều này có thể xảy ra không? – lostInTransit

+0

Tôi đang đối mặt với cùng một vấn đề tôi cũng có hai viewcontrollers và dealloc viewcontroller thứ hai là không nhận được gọi là khi pop từ ngăn xếp chuyển hướng. – Heena

0

nơi bạn điều hướng điều khiển của bạn có nên cần phải viết dòng này sau khi pushviewcontroller, [viewControllername release]; sau đó nó sẽ gọi mỗi phương thức Dealloc viewcontroller :)

+0

Đây không phải là câu trả lời thực tế cho câu hỏi được hỏi, nhiều hơn một 'điểm cần nhớ' cho các nhà phát triển ObjC mới. – Sushant

0

Bạn cũng nên nhớ rằng dealloc không phải lúc nào cũng được bảo đảm để chạy.

+1

Điều đó không đúng. Dealloc sẽ chạy khi tham chiếu cuối cùng đến một đối tượng đã được phát hành. – Jason

+6

Cũng không hoàn toàn không chính xác, điều này đúng nếu ứng dụng đang thoát theo Hướng dẫn lập trình quản lý bộ nhớ cho Cocoa. –

-1

sử dụng như [self.navigationController popToRootViewControllerAnimated: YES]; Nó làm việc cho tôi ... gọi tất cả metl dealloc của 10 bộ điều khiển xem của tôi

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