2010-07-06 36 views
6

Khi ứng dụng đi vào trạng thái chạy nền, có bao nhiêu thao tác sử dụng bộ nhớ bẩn tốt. Trong video táo nó đề cập rằng bộ nhớ bẩn nên được giảm càng nhiều càng tốt.iOS4 - chuyển ngữ cảnh nhanh

Nhưng trong ứng dụng của tôi, tôi đang sử dụng bộ điều khiển điều hướng để đẩy và bật chế độ xem. Sau khi di chuyển từ khoảng 20 trang khác nhau, dung lượng bộ nhớ bẩn đạt đến 30 MB hoặc hơn.

Cũng trên "dismissModalViewControllerAnimated" và "popViewControllerAnimated", dealloc không được gọi.

Tôi đã hai nghi ngờ:

  1. Với bao nhiêu bộ nhớ bẩn là có thể chấp nhận để đi tiếp?
  2. Bộ điều khiển điều hướng thay thế để hỗ trợ nút quay lại là gì?

Xin cảm ơn trước.

+0

1. Không phải 30MB. Các thiết bị iOS cũ hơn chỉ có ram 128MB, vì vậy ứng dụng của bạn sẽ lấp đầy khoảng 23% ... 2. Nếu bạn thực sự bị rò rỉ 30MB, có thể bạn không phát hành thứ gì đó, ở đâu đó, nó không phải là 'UINavigationController' ' s lỗi. –

+0

Xin chào Douwe, Cảm ơn bạn đã trả lời. Tại sao tôi nghi ngờ về UINavigationController bởi vì, tôi tiếp tục đẩy bộ điều khiển xem trong đó.Và khi tôi bật các contollers xem từ bộ điều khiển điều hướng, phương thức dealloc không được gọi là nơi tôi giải phóng các biến cá thể được xác định. Và bộ nhớ không bị xóa bởi tất cả các biến mẫu này. Tôi có làm gì sai không? Tôi có phải xóa các biến mẫu ở một nơi khác và không phải trong dealloc? – Sunil

+0

Bạn có bất kỳ tham chiếu nào khác cho bộ điều khiển chế độ xem của mình, ở nơi khác trong ứng dụng của bạn không? Nếu bạn đang popping chúng, nhưng vẫn có một tài liệu tham khảo ở một nơi khác để điều khiển, nó sẽ không nhận được GCed – blueberryfields

Trả lời

4

Bạn vẫn có thể có UIViewControllers của bạn vẫn được giữ lại nếu dealloc không được gọi.

Có lẽ bạn đang đặt đại biểu hoặc các lớp khác trong các UIViewControllers này đã lưu giữ và tham chiếu sao lưu cây (tham chiếu vòng tròn).

Một cách bạn có thể gỡ lỗi này là quá tải giữ lại và phát hành trong UIViewController của bạn và thiết lập một điểm break và đăng nhập retainCount.

Đây là một đoạn ma thuật tôi để lại chạy xung quanh giúp tôi một tấn khi tôi không thể tìm ra lý do tại sao tôi vẫn giữ lại một cái gì đó.

- (id)retain 
{ 
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super retain]; 
} 
- (void)release 
{ 
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    [super release]; 
} 
- (id)autorelease 
{ 
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super autorelease]; 
} 

__PRETTY_FUNCTION__ là macro ẩn đặc biệt trong CLang cung cấp tên hàm Objective-C khá là mảng char.

0
  1. Khi iOS bắt đầu hết bộ nhớ, nó sẽ cố gắng xóa các quy trình nền đang sử dụng nhiều bộ nhớ nhất. Vì vậy, trong khi không có số tuyệt đối tốt, giảm thiểu bao nhiêu bộ nhớ bạn sử dụng là một ý tưởng tốt. Để nó ở mức 30Mb tương đương với việc đảm bảo rằng ứng dụng của bạn sẽ bị giết
  2. Trừ khi bạn muốn thay đổi giao diện người dùng của mình, bạn không cần phải sử dụng bất kỳ thứ gì khác để UINavigationController xử lý nút quay lại của bạn. Tôi nghĩ vấn đề ở đây là nếu dealloc không được gọi vào một cửa sổ pop hoặc miễn nhiệm, bạn có một bộ nhớ bị rò rỉ

Hầu như tất cả các bộ điều khiển xem có dữ liệu được lưu trữ một cách hiệu quả và có thể được tái sinh khi trở về ứng dụng vào foreground . Hãy suy nghĩ về dữ liệu mà bạn phát hành khi bạn nhận được cảnh báo bộ nhớ khi ứng dụng đang chạy. (Bạn đang đáp ứng với cảnh báo bộ nhớ, phải không?) Đó là những thứ sẽ được phát hành khi bạn đi vào nền.

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