2009-11-05 20 views
8

Trong phần có tiêu đề 'Cảnh báo bộ nhớ' ở đây http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html, tôi không làm theo lý do tại sao IBOutlet được đặt thành 0 trong dealloc. NếuCài đặt IBOutlets để nil trong dealloc

self.anOutlet = nil 

gây ra sự cố như được đề cập trong chủ đề, tại sao họ đặt ivar thành không?

Nói chung, tại sao bạn sẽ đặt một ivar thành không trong dealloc khi bạn đang gọi phát hành?

Trả lời

12

Sau release, con trỏ về cơ bản không hợp lệ và truy cập lại vào con trỏ có thể gây ra sự cố. Bằng cách đặt biến số thành nil sau release, bạn sẽ ngăn sự cố đó xảy ra. Không có hại trong việc truy cập một con trỏ nil. Ví dụ bạn đã liên kết để chỉ đơn giản là chứng tỏ tại sao bạn nên đặt biến hoặc ivar thành nil sau release, ngay cả khi có vẻ như biến/ivar sẽ không được truy cập lại.

Trong ví dụ này, Ivar anOutlet là thực sự truy cập bởi các lớp cha sau phương pháp dealloc của bạn, vì vậy nếu bạn không cài đặt nó để nil bạn sẽ nhận được một vụ tai nạn. Các kịch bản như vậy là rất khó để phát hiện chỉ bằng cách nhìn vào mã, do đó, nó là một ý tưởng tốt để nil mọi biến sau khi phát hành, ngay cả trong dealloc.

1

Gửi thư trên một đối tượng được phát hành gây ra sự cố, việc gửi thư đến đối tượng không được bỏ qua.

0

Thỉnh thoảng khi một thuộc tính trở thành không hợp lệ (được đặt thành nil), chúng tôi cũng muốn làm cho các thuộc tính khác không hợp lệ. Nếu một lớp làm mất hiệu lực thuộc tính bằng cách sử dụng self.property_name = nil, thì điều này sẽ gửi một thông báo phát hành, điều này sẽ gây ra sự cố trong dealloc nếu chúng ta đã gọi là phát hành trên thuộc tính đó. Nếu sự vô hiệu xảy ra trong một siêu lớp, thì lỗi này bị ẩn và khá khó chịu. Vì vậy, bất cứ khi nào một superclass có thể làm mất hiệu lực một thuộc tính, nó có thể là một ý tưởng tốt để thiết lập nó thành không thay vì chỉ deallocing.

1

Đôi khi tai nạn là một điều tốt và giải pháp nhanh sẽ ẩn một vấn đề sâu hơn. Gọi một biến được phát hành có thể là điều bạn muốn biết.

Cuốn sách iOS Công thức đề cập đến vấn đề này:

Cleanup trong -dealloc
Ngoài việc phát hành tất cả các biến Ví dụ có liên quan trong -dealloc, ví dụ của chúng tôi đặt chúng vào nil. Thực hành này là một trong những chủ đề được tranh luận sôi nổi nhất trong số các lập trình viên về cacao, và cả hai bên đều giữ trọng lượng. Cuốn sách này không có nghĩa là tham gia vào cuộc tranh luận chút nào: chúng tôi đặt chúng thành không, nhưng điều đó không có nghĩa là bạn phải làm như vậy. Nếu bạn không thích giao dịch, vui lòng bỏ nó ra khỏi mã của riêng bạn.

Một tìm kiếm google nhanh chóng tìm thấy chủ đề này:
http://www.cocoabuilder.com/archive/cocoa/204055-why-should-we-set-ivars-to-nil-in-dealloc.html

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