2011-09-23 53 views
5

Tôi có một dylib mà tôi có thể tải thông qua tiêm trên mac os x. Lệnh gọi hàm xây dựng hoạt động tốt.Dylib destructor không được gọi là

__attribute__((constructor)) 
static void initialize() 

Nhưng hủy không được gọi? Vì vậy, tài nguyên khởi tạo rò rỉ.

__attribute__((destructor)) 
static void destroy() 
  1. Liệu dylib bị bốc dỡ tự động nếu ứng dụng bỏ?
  2. Dylib được tiêm có được tự động tải xuống nếu ứng dụng thoát không?
  3. Làm cách nào để chúng tôi có thể gỡ bỏ dylib khỏi ứng dụng khi chạy? Như mã tiêm của nó tôi có thể truy cập khu vực tư nhân. Có một lệnh để làm điều này?
+0

Câu hỏi tiếp tục http://stackoverflow.com/q/7553355/802921 – MacGeek

Trả lời

4

1, 2: No. Thư viện không thực sự được tải xuống khi ứng dụng thoát - chúng chỉ biến mất cùng với phần còn lại của quá trình, giống như cách các tài nguyên khác (ví dụ: xử lý tệp, bộ nhớ ánh xạ, ổ cắm, vv) được phát hành khi thoát.

3: Phụ thuộc vào cách bạn tiêm thư viện. Ví dụ: nếu bạn tải nó bằng cách sử dụng một cái gì đó như dlopen(), bạn sẽ có thể dỡ bỏ thư viện bằng cách sử dụng dlclose(); NSBundle có thứ gì đó tương đương.

Hãy nhớ rằng việc dỡ thư viện là lộn xộn. Đặc biệt, không an toàn khi dỡ bỏ một thư viện chứa bất kỳ lớp ObjC nào, vì thời gian chạy có thể có các tham chiếu được lưu trong bộ nhớ cache đến các lớp của bạn.

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