2014-11-16 15 views
9

Tôi đang sử dụng một UISplitViewController mỗi khi tôi nhấp vào một hàng trong VC chính tôi có thể thấy rằng viewDidLoad() được chạy trong chi tiết VC.iOS: Cách kiểm tra xem UIViewControllers có đang tải không? (Swift)

Điều này có nghĩa là tôi đang tạo một phiên bản mới Chi tiết VC mỗi hàng nhấp chuột?

Nếu có, làm thế nào tôi có thể kiểm tra xem VC chi tiết có tải đúng cách không và tôi không chỉ tạo ra nhiều chi tiết VC mới hơn?

Tôi hơi lạc lõng ở đây trong Swift. Trước đây tôi có thể NSLog trong dealloc() và xem UIViewController dỡ hàng đúng cách.

tôi ở đây Swift có một chức năng deinit nhưng điều này không bao giờ được gọi là:

deinit { 
    println("\(__FILE__.lastPathComponent)) : \(__FUNCTION__)") 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

1) Trong trường hợp tôi nên loại bỏ các quan sát viên của tôi?

2) Khi tôi tìm trong Trình gỡ lỗi gỡ lỗi trong Xcode, việc sử dụng bộ nhớ chỉ tiếp tục tăng lên và không bao giờ xuống.

Cập nhật: Chi tiết VC đang được gọi như sau:

if segue.identifier == "addEvent" { 
    if let controller = (segue.destinationViewController as UINavigationController).topViewController as? ManageViewController { 
     controller.manageEvent = nil 
     controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
     controller.navigationItem.leftItemsSupplementBackButton = true 
    } 
} 

Tôi không làm bất cứ điều gì khác biệt so với rất nhiều ví dụ tôi đã nhìn thấy, nhưng tôi lo lắng về deinit không được gọi

Cập nhật: Làm việc bây giờ - vấn đề là với đại biểu dừng deinit được gọi (xem bên dưới câu trả lời)

gốc đang không làm việc của tôi là:

protocol ManageViewDelegate { 
    func pressedButton(sender: AnyObject) 
} 

class ManageView: UIView { 
    var delegate: ManageViewDelegate? = nil 
    ... 
} 

Code mới làm việc:

protocol ManageViewDelegate: class { 
    func pressedButton(sender: AnyObject) 
} 

class ManageView: UIView { 
    weak var delegate: ManageViewDelegate? = nil 
    ... 
} 
+1

nếu 'deinit' không phải là được gọi, điều đó có nghĩa là bộ nhớ đang được giữ lại bởi * cái gì đó * và không được giải phóng. Bạn nên chỉnh sửa câu hỏi của mình để cho biết cách bạn đang chuyển đổi các bộ điều khiển chế độ xem chi tiết khi mỗi hàng được nhấp vào. –

+0

Đã cập nhật và làm cách nào để bạn làm nổi bật những từ nhất định như bạn đã làm với deinit? – Richard

+1

Bạn sẽ sớm biết cách sử dụng các khả năng "đánh dấu" của StackOverflow "" (http://stackoverflow.com/editing-help). –

Trả lời

24

Bạn có một cái nhìn với một tài sản tham chiếu trở lại với bộ điều khiển xem delegate. Điều này sẽ dẫn đến một chu kỳ tham chiếu mạnh (trước đây được gọi là chu kỳ lưu giữ) vì bộ điều khiển khung nhìn duy trì một tham chiếu mạnh mẽ đến chế độ xem cấp cao nhất của nó, lần lượt, duy trì một tham chiếu mạnh mẽ trở lại bộ điều khiển xem.

Trong Giải quyết Cycles mạnh tham khảo giữa các trường lớp phần của The Swift Programming Language: Automatic Reference Counting, Apple mô tả làm thế nào để giải quyết vấn đề này:

Swift cung cấp hai cách để giải quyết chu kỳ tài liệu tham khảo mạnh mẽ khi bạn làm việc với tính chất của kiểu lớp: tài liệu tham khảo yếu và tham chiếu không được công nhận.

Tham chiếu yếu và không được công nhận cho phép một phiên bản trong chu kỳ tham chiếu tham chiếu đến phiên bản khác mà không giữ sự giữ vững. Các trường hợp sau đó có thể tham chiếu với nhau mà không tạo chu kỳ tham chiếu mạnh.

Sử dụng tham chiếu weak bất cứ khi nào hợp lệ để tham chiếu đó trở thành nil tại một số thời điểm trong suốt thời gian tồn tại của nó. Ngược lại, sử dụng tham chiếu unowned khi bạn biết rằng tham chiếu sẽ không bao giờ là nil khi nó đã được đặt trong khi khởi tạo.

Vì vậy, bạn có thể giải quyết chu kỳ tài liệu tham khảo mạnh mẽ của bạn bằng cách xác định delegateweak:

weak var delegate: ManageViewDelegate? 

Đối rằng để làm việc, bạn phải xác định giao thức của bạn là một giao thức lớp:

protocol ManageViewDelegate: class { 
    // your protocol here 
} 

Điều đó sẽ giải quyết chu kỳ tài liệu tham khảo mạnh mẽ và loại bỏ sự cần thiết phải tự nil các delegate để giải quyết cycl tham khảo mạnh mẽ e.

0

Ngoài ra nếu bạn sử dụng các khối bạn cần phải thêm [tự yếu], nếu không, quan điểm sẽ không bị hủy diệt

setupObserve(postID) { 
     [weak self] chatRequest in 
    self?.update() 
} 

Chức năng deinit nên làm việc ra

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