2009-02-18 48 views
39

Khi deallocing một refrence Tôi đã nhìn thấy releasedealloc được sử dụng ví dụkhác biệt giữa phát hành và dealloc trong Objective-C

-(void)dealloc 
{ 
    [foo release]; 
    [nar dealloc]; 

    [super dealloc]; 
} 

Câu hỏi của tôi là khi nào là release được sử dụng và khi nào là dealloc được sử dụng ?

Cảm ơn

+0

Nếu bạn gọi '[self dealloc]' bên trong định nghĩa '-dealloc', thì nó sẽ dẫn đến đệ quy. Bạn có chắc là mã đúng không? – codelogic

Trả lời

53

Không bao giờ gọi dealloc trừ khi [super dealloc] ở phần cuối của phương pháp dealloc của lớp học của bạn. Phương thức release từ bỏ quyền sở hữu đối tượng. Khi một đối tượng Cocoa không còn có bất kỳ chủ sở hữu nào, nó có thể bị deallocated - trong trường hợp đó nó sẽ tự động được gửi một thông báo dealloc.

Nếu bạn định lập chương trình Cocoa, bạn cần đọc số Memory Management Guidelines. Nó vô cùng đơn giản một khi bạn vượt qua bướu ban đầu, và nếu bạn không hiểu những gì trong tài liệu đó, bạn sẽ có rất nhiều lỗi nhỏ.

+0

Còn về [self dealloc] như tôi đã trình bày trong ví dụ này, có thực sự cần thiết cho điều đó không? – hhafez

+6

Không chỉ là không cần thiết, việc gọi [self dealloc] trong phương thức dealloc của bạn tạo ra một vòng lặp vô hạn. – Chuck

2

Câu lệnh dealloc trong ví dụ của bạn được gọi khi số lượng giữ lại của đối tượng trở thành số không (thông qua một đối tượng gửi cho nó thông báo phát hành).

Vì nó không còn cần thiết, nó tự dọn dẹp bằng cách gửi thông báo release đến các đối tượng đang giữ.

1

Bạn không bao giờ phải gọi dealloc một cách rõ ràng (trừ khi đó là [super dealloc] trong phương thức dealloc, nhưng đó là ngoại lệ duy nhất). Objective-C xử lý việc quản lý bộ nhớ thông qua việc đếm tham chiếu, vì vậy bạn chỉ đơn giản là phải khớp với allocs của bạn/giữ lại với các bản phát hành/autoreleases và để cho đối tượng tự giải mã.

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