2015-02-24 18 views

Trả lời

41

Sử dụng phương thức dưới đây có chức năng giống như dealloc.

deinit { 
    // Release all resources 
    // perform the deinitialization 
} 

Một deinitializer được gọi ngay trước một trường hợp lớp được deallocated. Bạn viết deinitializers với từ khóa deinit, tương tự như cách intializers được viết bằng từ khóa init. Deinitializers chỉ có sẵn trên các loại lớp.

Swift Deinitializer

+2

Tính đến iOS 9, theo một câu trả lời dưới đây, các quan sát viên sẽ được tự động xóa do bạn trừ khi bạn đang sử dụng những khối dựa trên. – Crashalot

19

Bạn có thể sử dụng ba phương pháp:

1 - sau khi popViewController, lưng navigationController hoặc dismissViewControllerAnimated:

deinit { 
     print("Remove NotificationCenter Deinit") 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

hoặc

2-viewDidDisappear, loại bỏ sau khi nó đã được bộ điều khiển xem tiếp theo:

override func viewDidDisappear(animated: Bool) { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

hoặc

3-viewWillDisappear - trước khi mở xem tiếp theo:

override func viewWillDisappear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Swift 3,0 cú pháp:

NotificationCenter.default.removeObserver(self) 
+1

deinit là lựa chọn tốt nhất ở đây, tôi đoán vậy. – Glenn

+0

Theo iOS 9, theo @Nikola Milicevic, các nhà quan sát sẽ tự động bị xóa trừ khi bạn đang sử dụng các gói dựa trên khối. – Crashalot

41

Tính đến iOS 9 (và OS X 10.11), bạn không cần phải tự mình xóa các quan sát viên, nếu bạn không sử dụng các nhà quan sát dựa trên khối.

Hệ thống sẽ làm điều đó cho bạn vì nó sử dụng tham chiếu zero-yếu cho người quan sát, nơi có thể.

Thông tin khác có thể được tìm thấy tại Foundation Release Notes for OS X v10.11 and iOS 9.

Nếu người quan sát có thể được lưu trữ dưới dạng tham chiếu yếu zero, bộ nhớ cơ bản sẽ lưu trữ người quan sát dưới dạng tham chiếu yếu 0, nếu không thể lưu trữ đối tượng yếu (tức là nó có lưu giữ/giải phóng tùy chỉnh cơ chế đó sẽ ngăn chặn thời gian chạy từ việc có thể lưu trữ các đối tượng yếu ớt) nó sẽ lưu trữ đối tượng như là một tham chiếu zeroing không yếu. Điều này có nghĩa là các nhà quan sát không bắt buộc phải hủy đăng ký theo phương thức deallocation của họ.

+0

Rất tuyệt! Tuyệt vời anwser! – allenlinli

0

Tôi cũng muốn chỉ ra rằng bạn nên sử dụng phương pháp này:

func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?) 

Thay vì

func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol 

Sau này sẽ không loại bỏ các quan sát viên (Ran vào vấn đề này thời gian gần đây). Trước đây sẽ xóa người quan sát nếu bạn đang sử dụng iOS9.

+0

Khi nào thì người cũ đã loại bỏ người quan sát? – Shubham

+0

@Shubham Kiểm tra [this out] (https://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/) –

0

Nó cũng tốt nếu bạn thêm quan sát của bạn trong viewWillAppear() và loại bỏ chúng trong viewWillDisappear()

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