2009-04-07 29 views
7

Tôi nghĩ rằng tôi biết sự khác biệt, nhưng không biết làm thế nào để giải thích một cách chính xác.Điều gì giải thích tốt nhất về sự khác biệt giữa [myVar dealloc] và [myVar release]?

dealloc xóa bộ nhớ được đặt trước bởi biến đó hoàn toàn và ngay lập tức.

giảm phát hành bộ đếm lưu giữ của bộ nhớ của biến đó bằng -1. nếu đó là 1, thì đó là 0, vì vậy nó sẽ có tác dụng tương tự như dealloc trong thời điểm đó.

đúng không? hoặc là có một lời giải thích ngắn hơn?

Trả lời

13

Đúng vậy.

Nhưng bạn sẽ không sử dụng dealloc, khi sử dụng một đối tượng, vì bạn không biết số lượng giữ lại là gì. Bạn cũng không quan tâm. Bạn chỉ cần nói rằng bạn không cần nó nữa, bằng cách gọi release. Và một khi không ai, đối tượng sẽ tự gọi số dealloc.

7

Tất cả đều đúng, nhưng một điểm chính bạn đang thiếu là bạn không bao giờ nên tự mình gọi dealloc. Dưới đây là một số thông tin từ tài liệu của Apple trên phương pháp dealloc NSObject của:

(từ http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc)

Bạn không bao giờ gửi tin nhắn dealloc trực tiếp. Thay vào đó, phương thức của đối tượng được gọi gián tiếp thông qua phương thức giao thức NSObject phát hành (nếu thông báo phát hành dẫn đến số lần giữ lại của người nhận là của người nhận trở thành 0). Xem Lập trình quản lý bộ nhớ Hướng dẫn về ca cao để biết thêm chi tiết về việc sử dụng các phương pháp này.

lớp con phải thực hiện phiên bản riêng của họ về dealloc để cho phép việc phát hành của bất kỳ bộ nhớ thêm tiêu thụ bởi các đối tượng như lưu trữ tự động phân bổ cho dữ liệu hoặc đối tượng biến dụ thuộc sở hữu của đối tượng deallocated. Sau thực hiện đẳng cấp cụ thể deallocation, phương pháp lớp con nên kết hợp các phiên bản lớp cha của dealloc thông qua một thông điệp tới siêu:

+0

nhờ. tôi nghĩ rằng tôi là một chút nhầm lẫn bây giờ ... vì vậy bên trong các phương pháp dealloc của lớp con, tôi phải dealloc biến dụ của tôi, phải không? tức là - (void) dealloc { \t [yellowViewController dealloc]; \t [blueViewController dealloc]; [super dealloc]; } – Thanks

+0

Chỉ cần rõ ràng, không bao giờ gọi dealloc trên bất cứ điều gì ngoại trừ siêu. Việc thực hiện đúng phương thức Thanks 'dealloc là: - (void) dealloc {[yellowViewController release]; [phát hành blueViewController]; [super dealloc]; } – rpetrich

+0

Tôi thấy bạn đang đọc Bắt đầu phát triển iPhone 3 - Khám phá SDK (Tôi cũng vậy, tôi đã nhận ra dự án bộ điều khiển chế độ xem màu vàng/xanh lam). – mk12

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