단점은 없습니다. 그걸 써. 오늘 해. 이전 코드보다 빠릅니다. 이전 코드보다 안전합니다. 이전 코드보다 쉽습니다. 쓰레기 수거가 아닙니다. GC 런타임 오버 헤드가 없습니다. 컴파일러는 어쨌든 가지고 있어야하는 모든 장소에 보유 및 릴리스를 삽입합니다. 그러나 그것은 당신보다 더 똑똑하고 실제로 필요하지 않은 것들을 최적화 할 수 있습니다 (마치 루프 풀기, 일시 변수, 인라인 함수 등을 제거하는 것과 같습니다)
이제는 작은 단점 :
오랫동안 ObjC 개발자 인 경우 ARC 코드가 표시되면 약 1 주일 동안 트 위치합니다. 당신은 매우 빨리 이것을 극복 할 것입니다.
코어 파운데이션 코드에 브리징 할 때 약간의 (매우) 약간의 복잡성이 있습니다. id
을 void*
으로 처리하는 경우에는 약간 더 복잡합니다. id
의 C- 배열과 같은 것들은 올바르게하려고 생각할 수 있습니다. ObjC va_args
의 멋진 처리로 인해 문제가 발생할 수도 있습니다. ObjC 포인터에서 수학과 관련된 대부분의 일은 까다 롭습니다. 어쨌든이 점을 많이 가져서는 안됩니다.
id
을 struct
에 넣을 수 없습니다. 이것은 매우 드문 경우이지만 때로는 데이터를 압축하는 데 사용됩니다.
올바른 KVC 명명법을 따르지 않았고 ARC 및 비 ARC 코드를 혼합 한 경우 메모리 문제가 발생합니다. ARC는 KVC 이름 지정을 사용하여 메모리 관리에 대한 결정을 내립니다. 모든 ARC 코드라면 양쪽 모두 똑같은 "잘못된"일을하기 때문에 중요하지 않습니다. 그러나 ARC/비 ARC가 혼합 된 경우 불일치가 발생합니다.
ARC는 ObjC 예외가 throw되는 동안 메모리가 누출됩니다. ObjC 예외는 프로그램 종료까지 매우 가까워 야합니다. 상당한 수의 ObjC 예외를 잡으면 잘못 사용하고있는 것입니다. 이 문제는 -fobjc-arc-exceptions
을 사용하여 고칠 수 있지만 아래에 설명 된 처벌이 발생합니다.
ARC는 ObjC++ 코드에서 ObjC 또는 C++ 예외가 throw되는 동안 메모리가 누출되지 않지만 시간 및 공간 성능을 모두 희생합니다. 이것은 ObjC++의 사용을 최소화해야하는 이유 중 하나입니다.
ARC는 iPhoneOS 3 또는 Mac OS X 10.5 이전에서는 전혀 작동하지 않습니다. (이로 인해 많은 프로젝트에서 ARC를 사용할 수 없게되었습니다.) iOS 4 또는 Mac OS X 10.6에서는 포인터가 올바르게 작동하지 않지만 문제는 간단합니다. __weak
포인터는 훌륭하지만 ARC의 판매 포인트가 아닙니다.
코드의 95 % 이상에 대해 ARC는 훌륭하고 피할 수있는 이유가 전혀 없습니다 (OS 버전 제한을 처리 할 수있는 경우). ARC가 아닌 코드의 경우 파일별로 -fno-objc-arc
을 전달할 수 있습니다. Xcode는 불행히도 실제로는해야 할 일보다 훨씬 더 어렵게 만듭니다. 이것을 단순화하기 위해 비 -ARC 코드를 별도의 xcodeproj로 옮겨야합니다.
결론적으로 가능한 한 빨리 ARC로 전환하고 되돌아 보지 마십시오.
내가의 라인을 따라 코멘트 몇 본 적이
편집 "을 사용하여 ARC는 코코아 메모리 관리 규칙을 알고을 대신 할 수 없습니다." 이것은 대부분 사실이지만, 이유와 이유를 이해하는 것이 중요합니다. 첫째, 모든 코드가 ARC를 사용하고 Three Magic Words을 위반하는 경우에도 아무런 문제가 없습니다. 놀래키지만, 거기에 당신이 간다. ARC는 귀하가 보유해야한다는 것을 의미하지는 않지만 유지할 수있는 몇 가지 사항을 보유 할 수 있습니다. 오늘 코코아에서 새로운 수업을 가르치고 있다면, 실제 메모리 관리 규칙에 5 분 이상을 소비하지 않을 것입니다. KVC 이름 지정에 대해 논의하면서 메모리 관리 명명 규칙 만 언급 할 것입니다. ARC를 사용하면 실제로 메모리 관리 규칙을 전혀 배우지 않으면서도 훌륭한 프로그래머가 될 수 있다고 생각합니다.
그러나 중간 수준의 프로그래머가 될 수는 없습니다. Core Foundation과 올바르게 연결하기 위해서는 규칙을 알아야하며 모든 중간 프로그래머는 어느 시점에서 CF를 처리해야합니다. 그리고 혼합 ARC/MRC 코드에 대한 규칙을 알아야합니다. 그리고 void*
포인터를 id
(정확하게 KVO를 수행해야하는 경우)으로 뒤범벅 할 때 규칙을 알아야합니다. 블록은 ... 음, 블록 메모리 관리가 이상합니다.
저의 요점은 기본 메모리 관리가 여전히 중요하다는 것입니다.하지만 ARC를 사용하여 새로운 프로그래머를위한 규칙을 설명하고 재 작성하는 데 많은 시간을 소비 했었지만 ARC는보다 고급 주제가되었습니다. 차라리 새 개발자가 objc_retain()
이라는 기본 호출을 사용하여 머리를 채우는 대신 오브젝트 그래프로 생각하게 할 수 있습니다.
ipad/ios에는 가비지 콜렉션이 없습니다. OS X에 대해 이야기하고 있습니까? – dasblinkenlight
제 사과, 자바 용어를 비효율적으로 사용하고 있습니다. 즉, ARC를 사용하면 객체를 필요한 시간보다 오래 메모리에 보관 한 다음 나중에 자동 릴리스 풀에 그룹으로 릴리스 할 수 있습니다. 나중에 참조 할 Java 가비지 콜렉션과 마찬가지로 나중에 다른 오브젝트와 함께 보관 및 릴리스되는 효과입니다. –
@TenementFunster, 동일한 코드 (릴리스 호출을 뺀)에 대해 ARC는 객체를 ARC 이외의 코드로 처리하지 않습니다. 실제로, 그것은 종종 당신이 가지고있는 것보다 빨리 풀어 낼 것입니다. 아주 느린 것은 많지 않지만 일반적인 패턴을 너무 빨리 불러 일으켜 성능에 미치는 영향을 줄였습니다. 많은 일반적인 패턴들 (예를 들어 autorelease로 반환 된 객체를 유지함)의 경우, ARC가 자동으로 수행하는 것처럼 수동으로 작성할 수 없습니다. –