2010-06-28 36 views
13

Tôi có một lớp Object-C++ chứa một số con trỏ đối tượng C++ trung thực.Destructor trong Objective-C++

Khi lớp Obj-C++ bị hủy thì có gọi ngay dealloc không? Nếu vậy, thì cách tốt nhất để tiêu diệt lớp C++ bằng cách đặt

delete obj 

trong phương pháp dealloc?

Trả lời

23

Tôi giả sử khi bạn nói "lớp Obj-C++" nghĩa là lớp Objective-C có chứa một số lớp C++.

Lớp Objective-C không gọi dealloc khi chúng bị hủy; chúng bị phá hủy bằng cách gửi tin nhắn dealloc đến chúng.

Với chút thầy giáo ra đường đi, nếu phương pháp init của bạn instantiates obj sau đó, vâng, gọi delete obj trong dealloc:

-(void)dealloc { 
    delete obj; 
    [super dealloc]; 
} 
+3

ARC cấm gửi một tin nhắn dealloc - không cần phải gọi '[super dealloc]' khi sử dụng ARC như được trả lời [ở đây] (http://stackoverflow.com/questions/7292119/custom-dealloc-using-arc-objective -c) – benjineer

+0

@benjineer ARC chưa được phát hành khi câu trả lời này được viết, nhưng bạn đúng rằng '[super dealloc]' không tương thích với ARC. –

7

Là một bổ sung cho câu trả lời đúng Frank Shearar của, miễn là bạn đang sử dụng OSX 10.4 hoặc mới hơn SDK (và bạn có thể là, mặc dù tôi không chắc chắn về thời gian chạy iPhone ở đây) bạn cũng có thể bao gồm các thành viên C++ của các lớp Objective-C, tức là không cần trỏ đến một con trỏ. Vấn đề trong các phiên bản trước của OSX SDK là hàm tạo và hàm hủy của thành viên C++ đơn giản sẽ không được gọi. Tuy nhiên, bằng cách chỉ định tùy chọn biên dịch fobjc-call-cxx-cdtors (trong XCode, nó được hiển thị như là thiết lập GCC_OBJC_CALL_CXX_CDTORS), ctor và dtor sẽ được gọi. Xem thêm Apple docs, một chút xuống trang đó.

+0

Cũng hoạt động khi bạn cần lưu trữ một con trỏ miễn là bạn quấn nó, ví dụ: trong một 'std :: unique_ptr' – Sebastian