자동 참조 카운트

Automatic Reference Counting

Automatic Reference Counting(ARC)Clangcompiler메모리 관리 기능으로 Objective-CSwift Programming 언어에 대한 자동 참조 카운트를 제공합니다.컴파일 시 오브젝트 코드메시지에 삽입됩니다. retain그리고.release[1][2] 그러면 실행 시 참조 카운트가 증가하거나 감소하여 개체에 대한 참조 수가 0에 도달하면 해당 개체의 할당 해제를 표시합니다.

ARC는 실행 [3]시 오브젝트의 할당을 비동기적으로 해제하는 백그라운드프로세스가 없다는 점에서 가비지 컬렉션 추적과 다릅니다.가비지 수집을 추적하는 것과 달리 ARC는 참조 사이클을 자동으로 처리하지 않습니다.즉, 오브젝트에 대한 "강력한" 참조가 있는 한 오브젝트는 할당 해제되지 않습니다.따라서 강한 상호 참조는 교착 상태 및 메모리 누수를 일으킬 수 있습니다.약한 [4]참조를 사용하여 사이클을 끊는 것은 개발자에게 달려 있습니다.

Apple Inc.MacOS(OS X) 및 iOS와 같은 운영 체제에 ARC를 배포합니다.제한적 지원(ARCLite)[5] Mac OS X Snow Leopard 및 iOS 4 이후 사용 가능하며 Mac OS X LioniOS [6]5에서는 완전히 지원됩니다. 가비지 컬렉션은 OS X Mountain Lion에서 ARC를 위해 사용되지 않으며 Mac [7][8]Sierra의 Objective-C 런타임 라이브러리에서 제거되었습니다.

목표-C

다음 규칙은 ARC가 켜져 있을 때 컴파일러에 의해 적용됩니다.

  • retain,release,retainCount,autorelease또는dealloc개체로 전송할 수 없습니다.대신 컴파일러는 컴파일 시 다음과 같은 메시지를 자동으로 삽입합니다.[super dealloc]언제dealloc오버라이드 [9]됩니다.
    // ARC 미포함 - (무효)할당 해제 {    [[NSNotification Center default Center(기본 센터)] remove Observer(리모브 옵서버):자신];    [잘 하는 군요 할당 해제]; }  // ARC 포함 - (무효)할당 해제 {    [[NSNotification Center default Center(기본 센터)] remove Observer(리모브 옵서버):자신];    // [ super dealloc ]는 자동으로 호출됩니다. } 
  • 프로그램을 직접 캐스팅할 수 없습니다.id그리고.void *여기에는 Foundation 객체와 Core Foundation 객체 간의 캐스팅이 포함됩니다.[9]프로그램은 컴파일러에게 개체의 수명에 대한 자세한 정보를 알려주기 위해 특수 캐스트 또는 특수 함수를 호출해야 합니다.
    // ARC 미포함 - (동작하지 않다 *)give MeAString {     CFStringRef myString = [자신 일부 방법작성자ACFString];     동작하지 않다 *newString = (동작하지 않다 *)myString;     돌아가다 [newString 자동 리리스]; }  // ARC 포함 - (동작하지 않다 *)give MeAString {     CFStringRef myString = [자신 일부 방법작성자ACFString]; // 보유 카운트는 1     동작하지 않다 *newString = (__bridge_전송 동작하지 않다 *)myString; // 소유권이 ARC로 이전되었습니다.     돌아가다 newString; } 
  • 자동 리스 풀을 사용하여 개체를 일시적으로 할당하고 풀이 "드레인"될 때까지 메모리에 유지할 수 있습니다.ARC가 없으면NSAutoreleasePool이 목적을 위해 객체를 만들 수 있습니다.ARC 사용@autoreleasepool대신 블록: 임시 객체의 할당을 캡슐화하고 블록 끝에 [9]도달하면 할당 해제됩니다.
    // ARC 미포함 - (무효)loopThroughArray:(NSAray *)배열 {     위해서 (아이디 물건  배열) {         NSAutorease Pool *수영장 = [[NSAutorease Pool 할당하다] 초기화];         // 임시 개체를 많이 만듭니다.         [수영장 물을 빼다];     } }  // ARC 포함 - (무효)loopThroughArray:(NSAray *)배열 {     위해서 (아이디 물건  배열) {         @autorelease pool {             // 임시 개체를 많이 만듭니다.         }     } } 
  • 프로그램에서 함수를 호출할 수 없습니다.NSAllocateObject그리고.NSDeallocateObject[9]
  • 프로그램은 C 구조의 오브젝트 포인터를 사용할 수 없습니다.(structs)[9]
  • 프로그램이 메모리 존을 사용할 수 없습니다(NSZone[9]
  • 비 ARC 코드와 적절히 협력하기 위해 프로그램은 다음 문자로 시작하는 메서드 또는 선언된 속성을 사용하지 않아야 합니다(다른 getter를 명시적으로 선택하지 않는 한).new를 클릭합니다.[9]

재산 신고

ARC에는 몇 가지 새로운 속성 선언 속성이 도입되어 있습니다.이 속성 중 일부는 오래된 속성을 대체합니다.

ARC 미포함 ARC 포함 ARCLite 사용
retain strong
assign(개체 타입의 경우) weak unsafe_unretained
copy
  1. ^ ARCLite는 ARC이지만 약한 참조가 0이 되지 않습니다(ARC에 필요한 것보다 성능이 낮은 운영 환경에 배포할 때 사용됨).

약한 참조를 지우는 중

약한 참조를 제로화하는 것은 Objective-C ARC의 기능으로 자동으로 클리어(설정)됩니다.nil) 로컬 변수, 인스턴스 변수 및 선언된 속성을 나타내는 오브젝트의 할당 해제를 시작하기 직전에 weak-reference합니다.그러면 포인터가 유효한 오브젝트 또는nil포인터의 행잉을 회피합니다.이 기능이 도입되기 전에 "weak references"는 유지되지 않았지만 다음과 같이 설정되지 않은 참조를 참조했습니다.nil그들이 가리킨 물체가 (와 동등)배치가 해제되었을 때unsafe_unretained따라서 포인터가 매달릴 수 있습니다.일반적으로 프로그래머는 오브젝트가 할당 해제될 때 오브젝트에 대한 가능한 모든 약한 참조가 수동으로 0으로 설정되도록 해야 했습니다.약한 참조를 제로화하면 이 작업을 수행할 필요가 없어집니다.

선언된 속성 속성을 사용하여 약한 참조를 0으로 설정합니다. weak또는 변수 속성을 사용하여__weak.

제로잉 취약 참조는 Objective-C 런타임에서 추가 지원이 필요하기 때문에 Mac OS X Lion(10.7) 이상 및 iOS 5 이상에서만 사용할 수 있습니다.그러나 일부 OS X 클래스는 현재 취약한 [9]참조를 지원하지 않습니다.ARC를 사용하지만 위의 OS보다 오래된 버전을 지원해야 하는 코드에서는 약한 참조를 0으로 만들 수 없으므로 사용해야 합니다.unsafe_unretained약한 레퍼런스PLWeak Compatibility [ 1 ]라고 불리는 서드파티 라이브러리가 있습니다.이 라이브러리는 이러한 오래된 OS 버전에서도 약한 참조를 제로화할 수 있습니다.

변환 중

Xcode 4.2 이후는 코드를 [10]ARC로 변환하는 방법을 제공합니다.Xcode 4.5에서는 [Edit]> [ Refactor ]> [ Convert to Objective - C ARC ]의 순서로 선택합니다.Xcode는 대부분의 코드를 자동으로 변환하지만 일부 코드는 수동으로 변환해야 할 수 있습니다.Xcode는 변수가 자동 리스 풀 내에서 선언되고 풀 밖에서 사용되는 경우 또는 두 개체를 수신자 부담으로 특수 캐스트로 브리징해야 하는 경우 등 보다 복잡한 사용 사례가 발생할 경우 개발자에게 알려줍니다.

재빠르다

Swift에서는 오브젝트가 선언되지 않는 한 오브젝트에 대한 참조가 강합니다.weak또는unowned. Swift 에서는 Optional type(옵션 타입: 값을 가질 수도 있고 0일 수도 있는 값 타입)을 사용하여 명시적으로 0을 처리해야 합니다.옵션 유형은 조건문을 사용하여 "포장 해제"하여 처리해야 하며, 있는 경우 값을 안전하게 사용할 수 있습니다.반대로, 임의의 비옵션 타입에는 항상 값이 있기 때문에 0일 수 없습니다.

변화하다 myString: 스트링                   // 문자열만 사용할 수 있습니다. 변화하다 myOtherString: 스트링?             // 문자열 또는 0일 수 있습니다.  한다면 허락하다 myString = myOtherString {      // 옵션의 포장을 해제합니다.     인쇄물(myString)                    // 문자열이 있는 경우 인쇄합니다. } 

따라서 객체에 대한 강력한 참조는 Optional 유형일 수 없습니다. 객체는 참조 자체가 할당 해제될 때까지 힙에 보관되기 때문입니다.오브젝트의 할당을 해제하고 참조를 0으로 설정할 수 있으므로 약한 참조는 옵션 유형입니다.소유하지 않은 참조는 그 사이에 있으며, 강력하지도 않고 옵션 유형도 아닙니다.대신, 컴파일러는 참조 자체가 할당되어 있는 한 소유되지 않은 참조 포인트가 할당 해제되지 않는다고 가정합니다.일반적으로 대상 개체 자체가 소유되지 않은 참조를 유지하는 개체에 대한 참조를 보유하는 상황에서 사용됩니다.

변화하다 strong 레퍼런스: 마이클래스          // 강력한 참조, 0일 수 없습니다. 약한 변화하다 weak 레퍼런스: 마이클래스?      // 약한 참조, 0일 수 있습니다. 소유자가 없는 변화하다 소유하지 않은 참조: 마이클래스 // 약한 참조, 0일 수 없습니다. 

또한 Swift는 참조 유형 대신 가치 유형을 사용하고 장려한다는 점에서 목적 C와 다르다.Swift 표준 라이브러리의 대부분의 유형은 값 유형이며 값별로 복사됩니다. 반면 클래스와 폐쇄는 참조 유형으로 참조에 의해 전달됩니다.값 유형은 전달될 때 복사되므로 값 유형을 [11]만든 참조와 함께 자동으로 할당 해제됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Siracusa, John (July 20, 2011). "Mac OS X 10.7 Lion: the Ars Technica review". Ars Technica. Ars Technica. At section "Automatic Reference Counting". Retrieved November 17, 2016.
  2. ^ Kochan, Stephen G. (2011). Programming in Objective-C (4th ed.). Boston, Mass.: Addison-Wesley. pp. 408. ISBN 978-0321811905.
  3. ^ Hoffman, Kevin (2012). Sams teach yourself Mac OS X Lion app development in 24 hours. Indianapolis, Ind.: Sams. pp. 73. ISBN 9780672335815.
  4. ^ "General". Automatic Reference Counting. LLVM.org. Retrieved 15 August 2012.
  5. ^ "Objective-C Feature Availability Index". Apple, Inc. Retrieved 2013-10-14.
  6. ^ Sakamoto, Kazuki (2012). Pro Multithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch and Blocks. Apress. pp. xii. ISBN 978-1430241164.
  7. ^ Siracusa, John (July 25, 2012). "OS X 10.8 Mountain Lion: the Ars Technica review". Ars Technica. At section "Objective-C enhancements". Retrieved November 17, 2016.
  8. ^ "Xcode 8 Release Notes". Apple Developer. October 27, 2016. Archived from the original on March 19, 2017. Retrieved March 19, 2017.
  9. ^ a b c d e f g h "Transitioning to ARC Release Notes". Retrieved 14 September 2012.
  10. ^ "What's New in Xcode 4.2 – Automatic Reference Counting". Apple Inc. Archived from the original on 20 August 2012. Retrieved 3 October 2012.
  11. ^ "Value and Reference Types". Apple Developer. August 15, 2014. Retrieved November 17, 2016.

외부 링크