2011-08-31 2 views
0

(MonoTouch) MT를 사용하는 iOS 앱에서 메모리 누수가 발생하지 않도록 MT GC가 어떻게 작동하는지 이해하려고합니다.Monotouch : 가비지 수집기, 관리되는 개체 및 관리되지 않는 개체

MT 메모리 관리는 다음과 같은 방식으로 작동합니다. 각 개체에는 "친애하는 GC, 이제는 언제든지 공개 될 수 있습니다."라는 플래그가 있습니다. GC가 실행되면 플래그를 확인하고 메모리에서 오브젝트를 제거합니다. 그래서 MT는 모든 객체를 일종의 limbo에 넣습니다. 객체는 그 안에있는 객체가 해제 될 것입니다 (다음 이벤트주기, 아마도). 그것은 일종의 autorealease 메커니즘입니다. 그러나 dispose 메서드를 호출하는 객체를 명시 적으로 릴리스 할 수도 있습니다. 이 경우 유지 해제 메커니즘을 채택하는 것을 의미합니다.

MT에 대해 읽었을 때 관리 힙 (예 : 이미지 참조)과 관리되지 않는 힙 (예 : 이미지)으로 이동하는 개체가 있다는 것을 알았습니다. 첫 번째 경우 (관리되는 것)에서 나는 그것에 대해 걱정할 필요가 없다. GC는 잘 작동한다. 두 번째 (관리되지 않는 경우)에서는 메모리를 명시 적으로 릴리스해야합니다. 왜이 차이가 있습니까? 관리되지 않는 객체와 관리되는 객체를 구별 할 수있는 방법과 메모리 호출 dispose 메서드를 명시 적으로 릴리스하는 방법을 설명해 주시겠습니까?

미리 감사드립니다.

+0

추가 읽기 : http://stackoverflow.com/questions/2818315/iphone-no-garbage-collection-what-about-monotouch –

답변

1

설명이 올바르지 않습니다. GC (GB가 아니라 ;-) 및 .NET에 대한 Microsoft 설명서를 읽은 다음 Mono의 current GC에 대해 읽습니다 (아직 MonoTouch에 사용되지 않은 경우에도 next 버전 임).

위의 내용이 명확 해지면 큰 관리되지 않는 개체를 나타내는 경우 작은 관리되는 개체로 인해 문제가 발생할 수 있지만 누수가 아닌 일반적인 문제가 나타납니다. IDisposable을 사용하면 객체를 완성 할 때 더 많은 제어 기능을 제공하므로이 문제를 해결할 수 있습니다.

자세한 내용은 documentation을 참조하십시오.

+0

감사합니다! 관리 객체와 관리되지 않는 객체의 차이점을 설명 할 수 있습니까? GB의 실수를 수정했습니다. 감사. –

+1

GC는 관리 대상 개체에서만 작동합니다. 하지만 byte (1000000) 배열 (관리)이 있다고 가정하면 GC는 큰 객체라는 것을 알게되고 (이 지식을 사용할 수 있습니다). 이제 IntPtr (관리되는) 개체가 1000000 (관리되지 않는) 바이트를 가리키면 GC는 4/8 바이트 (32/64 비트) 만 알 수 있습니다. 따라서 IntPtr 또는 관리되지 않는 리소스를 처리 할 때는 IDisposable을 구현 (및/또는 사용)해야합니다. 비 메모리 관련 문제 (예 : 동시 열린 파일 핸들, 타이머 수 제한)가있을 수 있습니다. – poupou

+0

고마워요! 그러나 관리되는 리소스와 관리되지 않는 리소스를 구분하는 것이 가능한 방법은 무엇입니까? IntPtr은 XIB 생성 인터페이스에 대한 포인터입니다. 관리되지 않는 리소스는 예를 들어 이미지입니다. 사실이 아닌가? –

관련 문제