2011-09-23 1 views
5

mac os x에 주입을 통해로드 할 수있는 dylib가 있습니다. 생성자 호출이 제대로 작동합니다.dylib 소멸자가 호출되지 않습니다.

__attribute__((constructor)) 
static void initialize() 

소멸자가 호출되지 않습니까? 따라서 리소스가 누수를 초기화했습니다. 응용 프로그램이 종료하는 경우

__attribute__((destructor)) 
static void destroy() 
  1. dylib는 자동으로 배출됩니다합니까?
  2. 응용 프로그램이 종료되면 주사 된 dylib가 자동으로 언로드됩니까?
  3. 런타임에 응용 프로그램에서 dylib을 어떻게 언로드 할 수 있습니까? 주입 코드로서 개인 영역에 액세스 할 수 있습니다. 이것을하기위한 명령이 있습니까?
+0

계속 질문 http://stackoverflow.com/q/7553355/802921 – MacGeek

답변

4

1, 2 : 아니요. 응용 프로그램이 종료되면 라이브러리가 실제로 언로드되지 않습니다. 나머지 프로세스와 함께 사라지게됩니다. 다른 리소스 (예 : 파일 핸들, 매핑 된 메모리, 소켓, )가 종료 될 때 릴리스됩니다.

3 : 라이브러리 삽입 방법에 따라 다릅니다. dlopen()과 같은 것을 사용하여로드 한 경우, 예를 들어 dlclose()을 사용하여 라이브러리를 언로드 할 수 있어야합니다. NSBundle에 해당하는 항목이 있습니다.

라이브러리 언로드는 지저분합니다. 특히 ObjC 클래스가 포함 된 라이브러리를 언로드하는 것은 런타임에 클래스에 대한 참조를 캐시 할 수 있으므로 안전하지 않습니다.