2009-05-01 2 views
1

저는 코코아 터치 플랫폼에서 응용 프로그램을 개발하는 방법을 배웠습니다. 나는 먼 길을왔다 갔다하지만 내 머리를 감쌀 수없는 한 조각은 기억 관리이다.Objective-C 2.0과 CLR의 차이점은 메모리 관리와 관련 있습니다.

나는 처음부터 시작하려고하는 것보다는 비교 경로를 취할 것이라고 생각했습니다. CLR (.net)과 Objective-C 2.0의 차이점을 많이 찾을 수 없으므로 스택 오버 플로우 커뮤니티가이 질문에 도움이되는지 궁금합니다.

Objective-C 2.0과 CLR 간의 메모리 관리에서 중요한 차이점은 무엇입니까? Objective-C 2.0과 관련하여 iPhone OS에서 개발 중이며 autorelease 기능은 권장하지 않습니다.

나는 두 가지를 비교하려고합니다 ... .NET 배경에서 왔기 때문에 Objective-C 2.0 메모리 관리에 대해 알아야 할 것은 무엇입니까?

감사합니다.

답변

1

CLR은 가상 시스템에서 실행됩니다. 오브젝트의 모든 할당 해제는 가비지 콜렉션 시스템에 의해 처리됩니다. 일반적으로 Objective-C 메모리는 이전 C 스타일 malloc/free 또는 retain/release의 참조 계산 시스템을 통해 수동으로 관리해야합니다. 당신이 표준 "C"배경에서 오는 경우에, 기술은 너무 외국이게 보지 않을 것이다.

참조 계산에서 시스템은 특정 오브젝트가 몇 번 사용되었는지를 계산합니다. 이는 기본적으로 위에서 언급 한 "보유"입니다. 객체를 사용하여 무언가가 완료되면 객체는 수동으로 객체의 보유 수를 1 씩 감소시키는 "해제"메시지를 보냅니다. 계수가 0에 도달하면 시스템은 자동으로 객체의 할당을 해제합니다. 이것은 CLR/.NET에 비해 상당히 번거롭기는하지만 그 메커니즘은 더 나은 성능과 제어력을 제공합니다.

Macintosh에서 Objective-C 2.0으로 코딩하는 경우 Xcode의 옵션을 통해 가비지 수집을 활성화 할 수 있으므로 운이 좋을 것입니다. 이는 CLR이 제공하는 것과 더 가깝습니다. iPhone에서 개발하는 경우 가비지 수집은 메모리 및 CPU 측면에서 너무 많이 들기 때문에 옵션이 아닙니다. 메모리는 수동으로 관리해야합니다.

다행히도 개체에 "autorelease"메시지를 보내면 일반적으로 사용되는 중간 옵션이 있습니다. 매킨토시와 아이폰 모두에 포함 된이 메커니즘은 할당 된 객체를 기본적으로 글로벌 사전 (실제로는 자동 풀이라고도 함)에 저장합니다. 응용 프로그램이 있거나 풀이 비었을 때 개체는 할당이 해제됩니다. 그러나 모든 것이 자동 풀 풀에 들어가는 것은 아니며 모든 것을 자동으로 풀고 싶지는 않습니다. 나는 더 자세히 들어가는 Apple 사이트에서 Objective-C 2.0 프로그래밍 언어의 건조하지만 중요한 읽기를 권합니다.

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

행운과 인내심을 가지고. Objective-C는 .Net (25 년 이상 된)과 같은 블록에 새로운 아이가 아니지만 .Net이 이제 통합하기 시작한 놀라운 기능이 있습니다.

1

iPhone의 경우 수동입니다. 메모리를 할당하거나 보유하는 경우이를 해제해야합니다.

.NET CLR에서는 대부분의 경우 메모리가 무엇인지 또는 어떤 객체가 어떤 역할을하는지 상관하지 않습니다.

iPhone의 경우 모든 객체 할당의 균형을 유지해야합니다. 초기화 또는 릴리스와 함께 유지해야합니다. iPhone이 간단한 참조 계산 메커니즘을 사용하기 때문에 카운트가 0이되면 개체가 정리됩니다.

필자가 익숙해 져야 할 한 가지는 자동으로 보유를 수행하는 속성을 가질 수 있다는 것입니다. 따라서 객체를 만든 다음 속성에 할당하면 개수가 2가됩니다. 개체를 임시 변수에 할당 한 다음 임시 변수를 해제하여 개수를 1로 낮 춥니 다.