단점이 없습니다. 그걸 써. 오늘하십시오. 이전 코드보다 빠릅니다. 이전 코드보다 안전합니다. 이전 코드보다 쉽습니다. 가비지 콜렉션이 아닙니다. GC 런타임 오버 헤드가 없습니다. 컴파일러는 어쨌든 당신이 가져야 할 모든 위치에 유지와 릴리스를 삽입합니다. 그러나 그것은 당신보다 더 똑똑하고 실제로 필요하지 않은 것들을 최적화 할 수 있습니다 (루프를 풀고, 임시 변수를 제거하고, 인라인 함수 등을 제거 할 수있는 것처럼).
이제 작은 단점에 대해 말씀 드리겠습니다.
오랫동안 ObjC 개발자 인 경우 ARC 코드가 표시되면 약 1 주일 동안 경련을 겪게됩니다. 당신은 이것을 매우 빨리 극복 할 것입니다.
Core Foundation 코드에 연결하는 데 몇 가지 (매우) 작은 복잡성이 있습니다. 아무것도 처리에 더 많은 합병증이 약간 있다는 것을 취급합니다 id
A와 void*
. C-arrays와 같은 id
것은 올바르게 수행하기 위해 조금 더 생각해야 할 수 있습니다. ObjC의 멋진 처리 va_args
도 문제를 일으킬 수 있습니다. ObjC 포인터의 수학과 관련된 대부분의 작업은 까다 롭습니다. 어쨌든 이것의 많은 것을 가져서는 안됩니다.
당신은 넣을 수 없습니다 id
A의 struct
. 이것은 매우 드물지만 때로는 데이터를 압축하는 데 사용됩니다.
올바른 KVC 이름 지정을 따르지 않고 ARC 및 비 ARC 코드를 혼합하면 메모리 문제가 발생합니다. ARC는 KVC 이름 지정을 사용하여 메모리 관리에 대한 결정을 내립니다. 모두 ARC 코드라면 양쪽에서 똑같은 "잘못된"작업을 수행하기 때문에 문제가되지 않습니다. 그러나 ARC / 비 ARC가 혼합되어 있으면 불일치가 있습니다.
ARC는 ObjC 예외가 발생하는 동안 메모리를 누수합니다. ObjC 예외는 프로그램 종료 시점에 매우 가까워 야합니다. 상당한 수의 ObjC 예외를 포착하는 경우이를 잘못 사용하고있는 것입니다. 이 문제는를 사용하여 수정할 수 -fobjc-arc-exceptions
있지만 아래에 설명 된 패널티가 발생합니다.
ARC는 ObjC 또는 C ++ 예외가 ObjC ++ 코드에서 발생하는 동안 메모리를 누수하지 않지만 이는 시간과 공간 성능을 모두 희생합니다. 이것은 ObjC ++의 사용을 최소화해야하는 긴 이유의 또 다른 이유입니다.
ARC는 iPhoneOS 3 또는 Mac OS X 10.5 또는 이전 버전에서 전혀 작동하지 않습니다. (이로 인해 많은 프로젝트에서 ARC를 사용할 수 없습니다.)
__weak
포인터는 iOS 4 또는 Mac OS X 10.6에서 제대로 작동하지 않습니다. 이는 부끄러운 일이지만 해결하기는 상당히 쉽습니다. __weak
포인터는 훌륭하지만 ARC의 # 1 판매 포인트는 아닙니다.
95 % 이상의 코드에 대해 ARC는 훌륭하며이를 피할 이유가 전혀 없습니다 (OS 버전 제한을 처리 할 수있는 경우). 비 ARC 코드의 경우 -fno-objc-arc
파일별로 전달할 수 있습니다 . Xcode는 안타깝게도 실제로해야 할 일보다 훨씬 더 어렵게 만듭니다. 이를 단순화하기 위해 비 ARC 코드를 별도의 xcodeproj로 이동해야합니다.
결론적으로, 가능한 한 빨리 ARC로 전환하고 결코 뒤돌아 보지 마십시오.
편집하다
나는 "ARC를 사용하는 것이 Cocoa 메모리 관리 규칙을 아는 것을 대체 할 수 없다"는 몇 가지 주석을 보았습니다. 이것은 대부분 사실이지만 그 이유와 이유를 이해하는 것이 중요합니다. 첫째, 모든 코드가 ARC를 사용하고 Three Magic Words 를 위반하는 경우모든 곳에서 여전히 문제가 없습니다. 충격적이지만 거기에 있습니다. ARC는 유지하려는 의도가 아닌 일부 항목을 보유 할 수 있지만 해당 항목도 릴리스하므로 문제가되지 않습니다. 오늘 Cocoa에서 새 수업을 가르치고 있다면 실제 메모리 관리 규칙에 대해 5 분 이상을 쓰지 않을 것이며 KVC 이름 지정에 대해 논의 할 때 메모리 관리 이름 지정 규칙 만 언급했을 것입니다. ARC를 사용하면 메모리 관리 규칙을 전혀 배우지 않고도 실제로 괜찮은 초보 프로그래머가 될 수 있다고 믿습니다.
그러나 당신은 괜찮은 중급 프로그래머가 될 수 없습니다. Core Foundation과 올바르게 연결하려면 규칙을 알아야하며 모든 중급 프로그래머는 어느 시점에서 CF를 처리해야합니다. 그리고 혼합 ARC / MRC 코드에 대한 규칙을 알아야합니다. 그리고 당신은 (KVO를 올바르게 수행해야하는) void*
포인터로 엉망이 될 때 규칙을 알아야합니다 id
. 그리고 블록 ... 글쎄, 블록 메모리 관리는 이상합니다.
그래서 내 요점은 기본 메모리 관리가 여전히 중요하지만 새로운 프로그래머를위한 규칙을 설명하고 재 작성하는 데 상당한 시간을 소비했던 곳에서 ARC를 사용하면 더 고급 주제가되고 있습니다. 나는 새로운 개발자가 .NET에 대한 기본 호출로 머리를 채우는 것보다 객체 그래프 측면에서 생각하게 만들고 싶습니다 objc_retain()
.