objective-c - iOS内存管理【ARC、MRC、内存池】三者的关系?
PHP中文网
PHP中文网 2017-05-02 09:25:59
0
4
865

1.iOS内存管理有三种方法:ARC、MRC、内存池。
2.MRC:遵循谁申请、谁添加、谁释放的原则。需要手动处理内存技术的增加和修改。从12年iOS开始开始,逐步被ARC(自动内存计数)模式取代。
3.ARC就是取代了MRC,在App编译阶段,由Xcode添加了内存管理的代码。
4.内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。 内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

5.内存池是属于MRC的技术吗?ARC模式下有自动内存计数了,MRC下有手动内存处理了。那么内存池是MRC下的相对于release 方法的另一种内存计数处理方法吗?

6.我是搞不清ARC、MRC、内存池 三者的关系。

7.ARC的语义就是在实际开发中,根本不用操心内存管理问题。(是吗?)

PHP中文网
PHP中文网

认证0级讲师

모든 응답(4)
PHPzhong

ARCMRC은 실제로 원래의 메모리 관리 방법입니다. 적용: alloc; 릴리스: release 이러한 방식으로 더 복잡한 프로그램의 경우 메모리 적용 및 릴리스를 정확하게 계산해야 합니다. , 애플리케이션 객체가 언제 해제되어야 하는지 계산하는 것은 약간 혼란스럽습니다. 그래서 객체의 사용량을 계산하여 객체를 해제할지 여부를 결정하는 참조 카운팅 방법 Reference Counting이 등장했습니다.
MRCMannul Reference Counting이므로 개체 사용량을 수동으로 계산해야 합니다. 즉, 개체를 사용할 때마다 참조 횟수를 수동으로 retain 늘려야 하며, 사용할 때는 참조 횟수를 1씩 줄입니다. 이렇게 오랫동안 쓰다 보면 굉장히 귀찮게 느껴질 것 같아요. release, retain를 쓰려면 많은 노력이 필요하기 때문에 release의 자동 참조 카운트 기능도 있습니다. 간단합니다. 프로그램을 통해 ARCretain를 유추하면 release가 나와야 하는 곳에 대신 retainrelease을 씁니다.
AutoRelease은 완전히 다른 개념입니다. JavaGC 쓰레기 청소 메커니즘과 약간 비슷합니다. ARC 또는 MRC처럼 개체가 더 이상 사용되지 않으면 사용되지 않습니다. 즉시 석방하되, 석방할 기회를 기다리십시오. 오늘날에는 ARC가 더 성숙해져서 사용할 기회가 많지 않습니다. 그러나 일부 특수한 시나리오에서는 AutoReleaseARC이 할 수 없는 효과를 얻을 수 있습니다.

伊谢尔伦

아주 명확하게 설명해주셔서 ARC는 메모리 관리를 전혀 고려할 필요가 없다고 말할 수는 없지만 정말 완벽합니다. 메모리 풀은 신청한 메모리를 저장하는 곳입니다. 이해하기 쉽습니다. ARC의 경우 기존에 수동으로 릴리즈해야 했던 메모리를 릴리즈 풀에 직접 넣으면 시스템이 자동으로 릴리즈 풀에 있는 메모리를 릴리즈 해주는 것 같았던 것으로 기억합니다. MRC는 말씀하신대로, 신청자에 따라 공개가 원칙입니다. 그러고 보니 저는 아직도 MRC를 좋아하고, 힘이 많이 나는 것 같아요.

黄舟

역사에 대해 이야기하자면 oc는 출시 이후부터 MRC였으며 AutoRelease는 2.0의 기능입니다. 그런데 autorelease도 runloop와 관련이 있는지는 모르겠습니다. runloop가 main 함수에 사용되는 것으로 알고 있습니다.

漂亮男人
  1. MRC 초창기에는 프로그래머들이 수동으로 메모리를 관리했습니다.

  2. ARC는 이전에 Objective-C 코드를 분석하여 메모리 누수, 조기 릴리스 등의 오류를 찾는 데 사용되었던 "Clang 정적 분석기" 프로젝트였습니다. 그 효과가 너무 좋아서 Apple에서는 이 분석기를 자동으로 사용하는 것을 고려했습니다. 모든 유지 및 릴리스를 삽입하여 궁극적으로 ARC가 생성되었습니다.

  3. Autorelease Pool은 MRC와 동시에 있어야 하며 ARC와는 아무런 관련이 없습니다. 일반적인 사용 시나리오는 다음과 같습니다. 메소드가 새로 생성된 객체를 반환해야 하지만 이를 유지하고 싶지 않고 조기 릴리스가 걱정되므로 자동 릴리스 풀이 임시 소유자가 되도록 자동 릴리스 메시지를 보내서 이를 방지합니다. 배수할 때 이 임시 개수도 차감됩니다.

그래서 자동 릴리스 풀의 이름은 약간 오해의 소지가 있을 수 있습니다. 자동 릴리스 풀은 아무것도 "자동으로" 릴리스하지 않습니다.

요약하자면 MRC는 프로그래머가 메모리를 관리하기 위해 보유 및 해제를 작성하는 곳입니다. 자동 해제 풀 메커니즘은 일부 어려운 객체 소유권 문제를 해결하는 데 사용됩니다.


  • ARC의 실행 결과는 유지, 해제 이후의 코드가 자동으로 추가된다는 점인데, 이는 MRC에서 작성한 것과 다르지 않지만 오류가 덜 발생합니다. 즉, ARC 메커니즘은 Java의 가비지 수집과 완전히 다릅니다. ARC는 런타임 메커니즘이 아니라 컴파일 타임 메커니즘입니다.

  • ARC를 사용할 때 블록을 사용할 때 발생하기 쉬운 강력한 순환 참조와 같은 메모리 문제에 주의해야 합니다. 이는 비교적 기본적이므로 해결해야 합니다. Objective-C 책에서 다뤄질 것입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿