2009-12-03 31 views
8

Tôi có một mã rất đơn giản để hiển thị một bộ điều khiển phương thức (nextController là thành viên lớp):Sử dụng dismissModalViewControllerAnimated sẽ không giải phóng bất kỳ bộ nhớ

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil]; 
[self presentModalViewController:nextController animated:YES]; 
[nextController release]; 

Và sau đó khi bộ điều khiển nên ẩn:

[self dismissModalViewControllerAnimated:YES]; 
nextController = nil; 

Tất cả các công trình tốt như mong đợi, nhưng khi tôi chạy công cụ phân bổ đối tượng nó cho thấy rằng sau khi loại bỏ bộ điều khiển phương thức bộ nhớ nó được phân bổ không được giải phóng. Điều này trở thành một vấn đề bởi vì khi tôi hiển thị một số bộ điều khiển bộ nhớ đã hết ...

Ai đó có thể cho tôi một số manh mối không? Clang không thấy bất kỳ vấn đề gì, vì vậy tôi bị mắc kẹt trong giới hạn bộ nhớ, bởi vì bộ nhớ của các bộ điều khiển bị loại bỏ sẽ không được phát hành.


EDIT: Điều tôi khám phá ra bây giờ là nó dường như bị rò rỉ ở đâu đó trong nội dung của Apple. Cách tái tạo: XCode -> tạo dự án mới với mẫu "Ứng dụng tiện ích". Đừng tự viết mã. Chỉ cần tạo một ứng dụng tiện ích mới và chạy nó với "Phân bổ đối tượng", chọn để xem "Tạo & Vẫn đang sống". Bây giờ lật bộ điều khiển phương thức vài lần - bạn sẽ thấy bộ nhớ được phân bổ chỉ phát triển và phát triển mỗi khi bộ điều khiển phương thức xuất hiện và khi nó biến mất quá ...

Trả lời

0

Chế độ xem phương thức không phải là bản xem trước của chế độ gọi nhưng thay vào đó subview của cửa sổ ứng dụng và được giữ lại bởi chính cửa sổ. Nói chung, bạn không giữ lại một tham chiếu đến chúng trong bộ điều khiển gọi chúng. Thay vào đó, gợi lên khung nhìn phương thức và sau đó nó có giao tiếp với bộ điều khiển bằng cách xác định bộ điều khiển là đại biểu của khung nhìn.

Tôi nghĩ rằng nếu bạn sử dụng tổng hợp để tạo bộ truy nhập cho thuộc tính nextController được xác định bằng retain thì trình truy cập sẽ giữ lại bất kỳ đối tượng nào được gán cho thuộc tính. Chỉ cần đặt giá trị thành nil sẽ không giải phóng đối tượng trừ khi người truy cập được thiết lập để làm điều đó và tôi không nghĩ rằng những người được tạo tự động thực hiện.

Bạn sẽ rõ ràng phải gọi release trước khi đặt thành số không.

Nếu cách này không hiệu quả, hãy đăng mã cho định nghĩa của bạn thuộc tính nextController.

+1

Như tôi đã nói nextController là thành viên, không phải là thuộc tính: @interface MainScreenViewController: UIViewController { id nextController; } sử dụng "phát hành" thay vì gán nextController thành "nil" dẫn đến ngoại lệ: chế độ xem thưDidDisappear: được gửi tới đối tượng được giải phóng. Đối tượng dường như được giải phóng, tuy nhiên công cụ phân bổ đối tượng "được tạo và vẫn còn sống", chỉ hiển thị việc sử dụng bộ nhớ ngày càng tăng. –

1

Không có rò rỉ trong mã bạn hiển thị như xa như tôi có thể nhìn thấy. Có có thể bị rò rỉ trong InstructionsScreen có thể ngăn không bị phân phối.

Tôi nghĩ rằng nó đáng để chạy Trình phân tích tĩnh để xem nó có phát hiện rò rỉ hay không.

Sự rò rỉ trong mã mẫu Apple là thú vị. Có thể là có rò rỉ. Có vẻ như không chắc nhưng rõ ràng nó không phải là không thể. Tôi sẽ nói rằng nó có nhiều khả năng là nó là một dương tính giả trong dụng cụ, đó là lý do tại sao tôi muốn đề nghị sử dụng Analyzer tĩnh.

(Bạn có thể muốn báo cáo lỗi về sự cố rò rỉ.)

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