Runtime, Runloop, NSAutoReleasePool, ARC 간의 관계

2855 단어
면접에서 자주 묻는 몇 가지 질문: ARC/MRC(메모리 관리 메커니즘), NSAutoReleasePool, Runtime, Runloop, 다중 루트, 루트/프로세스
1、MRC/ARC
Objective-c는 두 가지 메모리 관리 메커니즘인 MRC(Mannul Reference Counting)와 ARC(Automatic Reference Counting)를 제공하여 각각 메모리에 대한 수동과 자동 관리를 제공한다. OC는 메모리 관리 계수의 원칙을 이용하여 메모리(retain, alloc, new, strong 등은 인용 계수를 +1,release는 인용 계수-1)를 관리하고 대상의 인용 계수가 0이면 대상은 소각되고 점용 메모리는 방출된다.MRC의 특징 중 하나는 메모리에 대해 신청하는 사람, 관리하는 사람, 방출하는 사람이다.ARC는 MRC에 비해 메모리 관리는 모두 시스템에 의해 제어되며 프로그래머가 관리할 필요가 없다.MRC 대상의 절대 다수는release의 위치를 확정하는 것이기 때문에 확실하지 않으면 autorelease를 쓸 것이다. ARC는 시스템의 은근한 도움으로 autorelease와 NSAutoReleasePool의 사용을 직접 추가했다.
↓↓↓
2、NSAutoReleasePool
MRC와 ARC에 대해 말하자면 직관적인 차이점 중 하나는release의 글쓰기가 적은 것이 아니라 그 중에서 중요한 지식 중 하나가 바로 AutoReleasePool(자동 방출 탱크, 개인적으로 더 정확한 명칭은 대상 인용 계수 자동 처리기)이다.NSAutoreleasePool은 여러 개를 동시에 가질 수 있다. 그 조직은 하나의 창고이다. 항상 하나의 창고 꼭대기 pool, 즉 현재 pool이 존재한다. 하나를 만들 때마다 창고에 하나를 넣고 현재 pool을 새 pool로 바꾼다. 그리고 pool에게 drain 메시지를 보낼 때마다 창고 꼭대기 pool을 팝업하고 현재 pool을 창고 안의 다음 pool로 바꾼다. 창고 꼭대기 pool이 소각될 때현재 pool 안의 모든 대상에게release 동작을 실행합니다.
그럼 pool은 언제 만들어진 거예요?언제 소각되었습니까?
모든 Runloop에 대해 시스템은 Autorelease pool을 은밀하게 만들 것이다. 이렇게 하면 모든release pool은 Call Stack과 같은 창고 구조를 구성하고 모든 Runloop이 끝날 때 현재 창고 꼭대기의 Autorelease pool은 소각된다. 이렇게 하면 이 pool 안의 모든 Object는release에 의해 소각된다.그럼 Runloop은 무엇일까요?UI 이벤트, Timer call, delegate call, 모두 새로운 Runloop입니다.
이것은 인터넷상에서 공인된 해석이라고 할 수 있지만 폴과 runloop 간의 관계는 폴이 언제 만들어졌는지, 언제 소각되었는지 잘 설명하지 못할 것이다.
↓↓↓
3、Runloop
1. runloop2, 에서 참고할 수 있는 글은 말 그대로 순환을 깊이 있게 말한다.예를 들어 한 사람이 태어나서 이름이 A라고 하면 이 사람이 살아 있을 때 누군가가 A라고 부르면 A는 A가 죽을 때까지 응답한다. 그러면 이 A의 이런 A가 살아 있을 때 A가 응답하는 과정을 듣는 것은 바로 runloop이다.그러면 프로그램이 시작된 상태에서 사용자의 입력을 받고 응답을 하면 runloop이 사용됩니다.그래서 runloop은'창설된 후에 기다리기->메시지를 받기->처리하고 퇴출될 때까지 순환하는 과정(또는 대상이라고 한다.OC의 이념은 모든 것이 대상이다)이다.그럼 runloop은 언제 만들어지고 소각되었나요?
↓↓↓
4. 프로세스 및 스레드
그 중의 연결을 정의합니다. 하나의 프로세스 (프로그램) 는 최소한 하나의 루트, 즉 주 루트를 포함합니다. 일반적으로 한 루트는 한 번에 하나의 작업만 수행할 수 있고, 실행이 끝난 후에 루트는 종료됩니다.만약에 우리가 스레드가 수시로 사건을 처리할 수 있지만 종료하지 않도록 하는 메커니즘이 필요하다면 이 스레드는'기다림->메시지 수신->처리'를 하고 순환하는 능력을 가지게 된다. 이런 모델은 흔히 Event Loop OC라고 불리는데 그 안에 runloop이 있다.
총결산
루틴의 생성, 즉runloop의 생성, 그리고 은밀하게 Autorelease pool을 만들고 대상의 인용, 계수 +1을 저장합니다.하나의 라인이 소각되고 대응하는runloop이 소각되며 대응하는pool도 소각(drain 실행), 관리하는 모든 대상이release 작업을 수행하고 인용 소각, 계수-1을 수행합니다.UI 이벤트, Timer call,delegate call 등, 사실상 시스템이 은밀하게 -> 수신 -> 실행 메시지를 기다리는 라인을 만들었습니다.
 NSArray *array = [NSThread callStackSymbols];//             (    )

Q: 창고 꼭대기의pool을 소각할 때pool관리에 대응하는 대상은 반드시 석방됩니까?
A:pool이 관리하는 것은 대상의 인용 계수 대상(모든 대상이 대상)일 뿐이고 창고 꼭대기의release에 의해 관리되는 것은 아니다. 다른 pool에 대상의 인용 계수 대상이 존재할 수도 있다. 한 대상에 강한 인용 인용이 존재하면 그 대상은 풀리지 않는다.
런타임은 사실 밑바닥의 C 언어 코드 라이브러리이다. OC 자체는 동적 언어이고 모든 OC의 모든 코드는 최종적으로 런타임 코드로 전환된다.
일부 개인의 이해가 틀리거나 잘못된 점이 있으면 지적해 주십시오.고맙습니다.

좋은 웹페이지 즐겨찾기