2008-10-30 35 views
6

Vì vậy, yeah, tôi là một anh chàng Java trong thế giới iPhone điên rồ này. Khi nói đến quản lý bộ nhớ Tôi stiill không có một ý tưởng rất tốt về những gì tôi đang làm.Làm cách nào để bộ nhớ quản lý UIViewControllers bằng bộ điều khiển điều hướng?

Tôi có một ứng dụng có sử dụng một bộ điều khiển chuyển hướng, và khi nó là thời gian để tiếp tục quan điểm tiếp theo tôi có mã trông như thế này:

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                    bundle:[NSBundle mainBundle]; 
[[self navigationController] pushViewController:myController animated:YES]; 

Bây giờ theo quy tắc cơ bản của Apple về quản lý bộ nhớ

bạn lấy quyền sở hữu của một đối tượng nếu bạn tạo ra nó sử dụng một phương pháp có tên bắt đầu bằng “alloc” hoặc “mới” hoặc chứa “bản sao” (ví dụ, alloc, newObject, hoặc mutableCopy), hoặc nếu bạn gửi nó là retain tin nhắn. Bạn chịu trách nhiệm từ bỏ quyền sở hữu đối tượng bạn sở hữu bằng cách sử dụng release hoặc autorelease. Bất kỳ lúc nào bạn nhận được một đối tượng, bạn không được giải phóng nó.

Với tôi, điều đó có nghĩa là tôi phải phát hành myController hoặc gửi cho nó một tin nhắn autorelease. Nhưng, bất cứ khi nào tôi thử làm điều đó ứng dụng của tôi gió lên bị rơi khi tôi đẩy và bật chế độ xem ra khỏi ngăn xếp.

Điều này không có mùi với tôi, nhưng khi chạy các thiết bị, nó tuyên bố rằng tôi không có bất kỳ rò rỉ bộ nhớ nào.

Vì vậy, tôi câu hỏi của tôi là

  1. Tôi có làm đúng điều này?
  2. Bộ điều khiển điều hướng có sở hữu MyViewController hay không, giải thích sự thiếu rò rỉ bộ nhớ?
  3. Tôi có nên gán myController cho một biến mẫu trong ViewController gốc của mình không? Trong trường hợp đó nó sẽ được đánh dấu giữ lại và tôi sẽ phát hành trong phương pháp dealloc của rễ

Trả lời

3

@Ben Gottlieb tại sao bạn cần tự động sửa trước khi đẩy? Giữ lại đếm ở phân bổ đối tượng là 1, autorelease trước hoặc sau khi đẩy không ảnh hưởng đến giữ lại đếm, mặc dù thường autoreleasing như một vấn đề của phong cách được áp dụng afer đối tượng alloc/init:

[[[object alloc] init] autorelease]; 

@bpapa,

2) Khi đẩy, bộ điều khiển điều hướng sẽ giữ lại bộ điều khiển xem. Sau đó khi khung nhìn này được bật ra khỏi ngăn điều khiển dẫn hướng, bộ điều khiển chuyển hướng sẽ giải phóng nó.

3) Trừ khi có lý do rõ ràng để giữ chế độ xem đó, bạn không nên gán nó cho biến mẫu. Nói chung, bạn muốn lượt xem của mình tồn tại chỉ miễn là bạn cần chúng.

+0

Tôi đã chỉ tương phản việc sử dụng tự động phát hành với bản phát hành. Bạn có thể autorelease trước hoặc sau, nó không quan trọng, nhưng nếu bạn phát hành, bạn PHẢI làm điều đó sau. –

9

Vấn đề là (rất có thể) bạn đang phát hành viewController bạn trước Controller Navigation có một cơ hội để khẳng định quyền sở hữu. Có hai cách xung quanh này:

  • -release điều khiển của bạn sau đẩy nó vào Nav khiển
  • -autorelease điều khiển của bạn trước đẩy nó. Nếu bạn làm điều này, các NSAutoreleasePool hoạt động (mà bạn không cần phải lo lắng về) sẽ chăm sóc phát hành bộ điều khiển của bạn tại một thời gian sau đó.
Các vấn đề liên quan