2012-12-06 33 views
5

Tôi đang trộn nhiều bảng phân cảnh cùng với các tệp NIB trong ứng dụng iOS6/iOS6 của mình.Nhiều bảng phân cảnh trong quản lý bộ nhớ iOS +

Quản lý bộ nhớ hoạt động như thế nào với nhiều bảng phân cảnh?

  • Khi tôi quay lại tệp nib khác/chuyển đến bảng phân cảnh khác, bảng phân cảnh đó có nằm trong bộ nhớ không?
  • Tôi có thể nhận được một "Mảng" của bảng phân cảnh trong ngăn xếp cách tôi có thể nhận được mảng các chế độ xem trong ngăn xếp của trình điều khiển điều hướng với UIViewControllers không?
  • Để quản lý bộ nhớ, tôi có thể bật hoặc xóa bảng phân cảnh khỏi bộ nhớ không? Tôi có đặt nó thành không khi tôi đi đến bảng phân cảnh khác không?

lý do tại sao tôi đang sử dụng nhiều storyboards trộn với các tập tin nib:

  • Tôi muốn dòng câu chuyện kịch bản phức tạp. Nó không có ý nghĩa để slam tất cả vào một nơi.
  • Cuối cùng, tôi sẽ làm việc với nhiều người khác nhau và tôi tìm các đối số cho công việc nhóm, kiểm soát phiên bản đủ hấp dẫn để chọn tuyến đường nhiều bảng phân cảnh
  • Tôi đang trộn các tệp NIB vì bảng phân cảnh chưa hoạt động với nib phức tạp tác phẩm, nhiều lần xem chương trình vv

My Code Snippets

Bên InitialNibFile.m < - được đưa ra từ các appdelegate.

- (IBAction)newStoryboardBtnPressed:(id)sender { 

[self.view removeFromSuperview]; // here I remove this view from the superview to save memory 
UIStoryboard *newStoryboard = [UIStoryboard storyboardWithName:@"NewStoryboard" bundle:nil]; 
UIViewController *initialSettingsVC = [newStoryboard instantiateInitialViewController]; 

[self presentViewController:initialSettingsVC 
        animated:YES completion:nil]; 

} 

Ở đây, Bên trong chế độ xem UIViewController nằm trong cảnh bảng phân cảnh.

- (IBAction)anotherStoryboardBtnPressed:(id)sender { 

    // I'm inside a storyboard right now. I'm calling another storyboard. 
    // can i remove this storyboard before i launch the otherone? will keeping 2 or 3 toryboards in memory cause a memory leak? 

    UIStoryboard *settingsStoryboard = [UIStoryboard storyboardWithName:@"AnotherStoryboard" bundle:nil]; 
    UIViewController *initialSettingsVC = [settingsStoryboard instantiateInitialViewController]; 
    // i'm going to load this view controller modally 
    // initialSettingsVC.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal; 
    [self presentViewController:initialSettingsVC 
         animated:YES 
        completion:nil]; 

} 

Trả lời

7

Vì vậy, ở đây chúng tôi đi =)

Khi tung ra một storyboardA, nếu tôi quay trở lại một tập tin nib/đi vào bảng phân cảnh khác, làm thế storyboardA chỉ ở lại đó trong bộ nhớ?
Bảng phân cảnh được giữ lại bởi thuộc tính UIViewController mà bạn tạo (thông qua số storyboard). Vì vậy, có, nó ở lại trong bộ nhớ cho đến khi tất cả các bộ điều khiển xem của nó là dealloc'd. Kiểm tra (tóm tắt) documentation.

Tôi có thể nhận được một "Mảng" của bảng phân cảnh trong ngăn xếp cách tôi có thể nhận được mảng các chế độ xem trong ngăn xếp của trình điều khiển điều hướng với UIViewControllers không?
Không, vì bảng phân cảnh độc lập với nhau. Tuy nhiên, bạn có thể lấy các bảng phân cảnh bằng cách lặp qua các bộ điều khiển xem trong ngăn xếp điều hướng của bạn.

Để quản lý bộ nhớ, tôi có thể bật hoặc xóa bảng phân cảnh khỏi bộ nhớ không? Tôi có đặt nó thành không khi tôi đi đến bảng phân cảnh khác không?
Nó sẽ ở xung quanh miễn là bạn có bộ điều khiển chế độ xem tức thời trong bộ nhớ.Khi bạn sử dụng storyboardWithName: một đối tượng tự động được trả lại cho bạn. Bộ điều khiển xem sẽ giữ lại nó, do đó, đừng lo lắng về việc phát hành hoặc thiết lập để không.

Đối với tài liệu tham khảo cho những câu hỏi khác của bạn, tôi hoãn đến SO và phần còn lại của internet:
Best Practices for Storyboards on SO
UIStoryboard best practices
Multiple Storyboards in iOS on SO

Chúc mừng Viết kịch bản.

+0

Cảm ơn rất nhiều MishieMoo! Điều này đã giúp rất nhiều. –

+0

Đảm bảo chấp nhận câu trả lời nếu câu trả lời cho câu hỏi của bạn =) – MishieMoo

+0

Câu trả lời của thiên tài ... Công việc tốt ... –

4

Có vẻ như bạn đang cố tránh các bộ điều khiển xem không cần thiết trong bộ nhớ. Đó là một điều tuyệt vời để tránh vì bộ điều khiển xem lớn theo nghĩa là chúng tham chiếu rất nhiều đối tượng khác. Câu hỏi của bạn làm cho nó âm thanh như thể bạn đang lo lắng rằng các starboard tham chiếu tất cả các bộ điều khiển xem trong bảng phân cảnh, và do đó giữ tất cả chúng xung quanh quá. Đó không phải là trường hợp. Đối tượng cốt truyện chỉ là tham chiếu đến các tệp trong thư mục tài nguyên của gói ứng dụng của bạn và mỗi khi được yêu cầu tạo bộ điều khiển chế độ xem mới, nó sẽ khởi tạo một tệp mới từ các tài nguyên đó. Ví dụ, nó có thể khởi tạo cùng một bộ điều khiển xem mẫu từ bảng phân cảnh nhiều lần. Nó không giữ bất kỳ bộ điều khiển xem trực tiếp nào sau khi chúng được khởi tạo.

+0

Cảm ơn Jon! Tôi làm theo lời khuyên và đã làm các bản ghi đếm số lượng bộ điều khiển xem trong mảng ngăn xếp điều hướng của tôi. Những gì bạn đang nói là có ý nghĩa ngay bây giờ! –

1

Có vẻ như bạn đang cố gắng để tránh giữ điều khiển xem không cần thiết trong bộ nhớ

Điều quan trọng là nhận ra rằng kịch bản được giữ trong bộ nhớ cho các đời của ứng dụng khi nó đã được khởi tạo. Nếu đó không phải là thứ bạn muốn, thì bạn có thể biến thuộc tính cố định tĩnh thành một thuộc tính tĩnh. Mở rộng bảng phân cảnh của bạn, điều tương tự bạn có thể áp dụng cho bộ điều khiển chế độ xem để làm cho bộ nhớ ứng dụng của bạn sạch sẽ.

import UIKit 

extension UIStoryboard { 

static var main: UIStoryboard { 
    return UIStoryboard(name: "Main", bundle: Bundle.main) 
} 

}

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