developer tip

Objective-C 자동 참조 계산과 가비지 수집의 차이점은 무엇입니까?

optionbox 2021. 1. 8. 08:08
반응형

Objective-C 자동 참조 계산과 가비지 수집의 차이점은 무엇입니까?


Xcode 4.2에 도입 된 새로운 ARC (Automatic Reference Counting)로 인해 더 이상 Objective-C에서 유지 / 해제를 수동으로 관리 할 필요가 없습니다.

이것은 Mac의 Objective-C 및 다른 언어에서 수행되는 가비지 수집과 유사합니다. ARC는 가비지 콜렉션과 어떻게 다릅니 까?


여기 에 내 대답 에서 설명했듯이 ARC는 수동 메모리 관리 및 가비지 수집 추적의 장점을 모두 제공 할 수 있습니다. 대부분 개발자가 Objective-C 개체에 대한 수동 유지, 릴리스 및 자동 릴리스를 추적 할 필요가 없지만 모바일 장치에서 제한된 리소스를 사용하고 실행중인 응용 프로그램에서 가끔씩 버벅 거림을 유발할 수있는 가비지 수집기 프로세스의 필요성을 방지합니다. .

ARC는 모든 Objective-C 개발자가 수년 동안 사용해야했던 규칙을 적용하여 컴파일 타임에 참조 계산에 필요한 적절한 보유 및 릴리스를 삽입합니다. 이렇게하면 개발자가 직접 관리 할 필요가 없습니다. 유지 및 해제가 컴파일 타임에 삽입되기 때문에 지속적으로 메모리를 스윕하고 참조되지 않은 개체를 제거하는 데 수집기 프로세스가 필요하지 않습니다.

추적 가비지 수집이 ARC에 비해 갖는 한 가지 작은 장점은 ARC가 유지주기를 처리하지 않는다는 것입니다 . 여기서 추적 가비지 수집이이를 선택할 수 있습니다.

주제에 대한 훌륭한 읽기는 Apple의 Objective-C 메일 링리스트 에있는 이 스레드에서 나옵니다 . Chris Lattner는 다음과 같이 말합니다.

ARC에 비해 GC의 주요 장점은 유지주기를 수집한다는 것입니다. 두 번째 장점은 "보유 된"할당이 단순한 저장소이기 때문에 "원자 적"이라는 것입니다. ARC는 libauto GC에 비해 몇 가지 큰 장점이 있습니다.

  1. GC가 "언젠가 나중에"객체를 해제하는 결정 론적 객체 회수 (객체에 대한 마지막 강력한 참조가 사라질 때)가 있습니다. 이는 수집기가 "버그가있는 창에서"트리거하지 않기 때문에 노출되지 않는 GC 앱에 존재할 수있는 미묘한 버그 클래스를 정의합니다.
  2. 고수위 표시는 일반적으로 객체가 더 빨리 해제되기 때문에 GC보다 ARC에서 훨씬 낮습니다.
  3. libauto는 취약한 프로그래밍 모델을 제공하므로 쓰기 장벽 등을 잃지 않도록주의해야합니다.
  4. 모든 시스템 프레임 워크가 GC가 깨끗한 것은 아니며 프레임 워크는 진화함에 따라 때때로 회귀합니다.
  5. ARC는 잘못된 뿌리로 고통받지 않습니다. libauto는 보수적으로 스택을 스캔하므로 포인터처럼 보이는 정수가 객체 그래프를 루트 할 수 있습니다.
  6. ARC에는 앱이 시작되고 중지되어 UI가 끊기는 기능이 없습니다. libauto는 모든 스레드를 즉시 중지하지 않기 때문에 GC 구현이 진행되는 한 꽤 발전되었지만 일반적으로 모든 UI 스레드를 중지합니다.

현재 수동 메모리 관리 프로젝트와 Objective-C 가비지 수집을 사용하는 프로젝트를 ARC로 마이그레이션하고 있습니다. 잠시 동안 몇 개의 Mac 응용 프로그램에서 가비지 수집을 사용한 후 이러한 프로젝트를 ARC로 이동하면 몇 가지 중요한 이점이 있습니다.


ARC 는 저전력 모드 환경 (모바일 장치)에서 효율적으로 만드는 컴파일 시간 "참조"객체에 의존합니다.

GC 는 다중 스레드 환경에서 효율적으로 만드는 런타임 기반 "연결 가능한"개체에 의존합니다.

조작

ARC는 실행 파일에 코드를 삽입하여 참조 횟수에 따라 사용되지 않는 개체에서 "자동으로"실행되도록합니다.

GC는 사용하지 않는 개체 그래프를 감지하고 (유지주기를 제거) 불확실한 시간 간격으로 제거하므로 런타임에서 작동합니다.

자동 참조 계수의 장점

  • 사용되지 않는 객체의 실시간 결정 론적 소멸.
  • 백그라운드 처리가 없습니다.

가비지 컬렉션의 장점

  • GC는 유지주기를 포함하여 전체 개체 그래프를 정리할 수 있습니다.
  • GC는 백그라운드에서 진행되므로 일반 애플리케이션 흐름의 일부로 수행되는 메모리 관리 작업이 줄어 듭니다.

자동 참조 계수의 단점

  • ARC는 유지주기를 자동으로 처리 할 수 ​​없습니다.

가비지 컬렉션의 단점

  • GC는 백그라운드에서 발생하기 때문에 객체 릴리스의 정확한 시간 프레임은 결정되지 않습니다.
  • GC가 발생하면 응용 프로그램의 다른 스레드가 일시적으로 보류 될 수 있습니다.

ARC는 가비지 콜렉션과 어떻게 다릅니 까?

ARC는 가비지 콜렉션의 한 형태입니다.

아마도 "ARC와 가비지 수집 추적 (예 : JVM 및 .NET)의 차이점은 무엇입니까?"을 의미 할 것입니다. 주요 차이점은 ARC가 느리고 누출주기가 있다는 것입니다. 이것이 JVM과 .NET 모두 추적 가비지 수집기를 사용하는 이유입니다. 자세한 내용 은 참조 계산 및 추적 가비지 수집은 어떻게 비교합니까?를 참조 하십시오 . .


짧고 달콤한 대답은 다음과 같습니다.

Java의 GC는 Runtime이고 ARC는 컴파일 시간입니다.

GC는 런타임에 객체에 대한 참조를 가지며 객체 런타임의 종속성을 확인합니다. ARC가 릴리스를 추가하는 동안 컴파일 타임에 자동 릴리스 호출을 유지합니다.

참조 URL : https://stackoverflow.com/questions/7874342/what-is-the-difference-between-objective-c-automatic-reference-counting-and-garb

반응형