ARC로? ARC로?장점과 단점은 무엇입니까?
현재 제가 작업하고 있는 프로젝트의 코드 대부분이 iOS 5.0 이전에 작성되었기 때문에, 저는 아직 ARC를 사용하지 않았습니다.
그냥 궁금해서요, 수동으로 보관/해제하지 않는 편리함이 (그리고 결과적으로 더 신뢰할 수 있는 코드가 나올 수 있을까요?ARC를 사용하는 데 드는 '비용'을 초과합니까?ARC에 대한 당신의 경험은 무엇이며, 당신은 그것을 추천하시겠습니까?
그래서:
- ARC는 프로젝트에 얼마나 많은 이점을 제공할 수 있습니까?
- ARC는 자바에서 가비지 컬렉션과 같은 비용이 있나요?
- ARC를 사용해 보셨습니까? 그렇다면 지금까지 어떻게 찾으셨습니까?
단점은 없습니다.사용하세요.오늘 해보세요.이전 코드보다 빠릅니다.이전 코드보다 안전합니다.이전 코드보다 쉽습니다.이것은 쓰레기 수거가 아닙니다.GC 런타임 오버헤드가 없습니다.컴파일러는 보유 및 릴리스를 사용자가 있어야 하는 모든 위치에 삽입합니다.그러나 사용자보다 더 스마트하고 실제로 필요하지 않은 항목을 최적화할 수 있습니다(루프를 풀고 임시 변수를 제거하고 인라인 기능 등을 제거할 수 있는 것처럼).
자, 이제 작은 단점에 대해 말씀드리겠습니다.
오랜 기간 ObjC 개발자라면 ARC 코드를 보면 일주일 정도 경련을 일으킬 것입니다.당신은 이것을 아주 빨리 극복할 것입니다.
Core Foundation 코드를 브리징하는 데 약간의 (매우) 작은 문제가 있습니다.환자를 치료하는 모든 것을 다루는 데는 약간 더 많은 복잡성이 있습니다.
idvoid*의C-arrays 같C-arrays 것C-arrays 은C-arrays .id정확하게 하는 것에 대해 조금 더 생각할 수 있습니다. ObjC의va_args또한 문제를 일으킬 수 있습니다.ObjC 포인터의 수학과 관련된 대부분의 것들은 더 까다롭습니다.어떤 경우에도 당신은 이것을 많이 가져서는 안 됩니다.다없니는 넣을 수 .
id순식간에struct이것은 매우 드물지만, 때때로 데이터를 포장하는 데 사용됩니다.올바른 KVC 명명을 따르지 않고 ARC 코드와 비 ARC 코드를 혼합하면 메모리 문제가 발생합니다.ARC는 KVC 명명을 사용하여 메모리 관리에 대한 결정을 내립니다.만약 그것이 모두 ARC 코드라면, 그것은 양쪽에서 같은 "잘못된" 일을 할 것이기 때문에 문제가 되지 않습니다.하지만 ARC/non-ARC가 혼합된 경우 불일치가 발생합니다.
ObjC 예외 스로우 중에 ARC에서 메모리 누수가 발생합니다.ObjC 예외는 프로그램 종료 시간에 매우 가까워야 합니다.많은 ObjC 예외가 발견되면 이를 잘못 사용하는 것입니다.이는 다음을 사용하여 수정할 수 있습니다.
-fobjc-arc-exceptions그러나 아래에 설명된 벌칙이 적용됩니다.ARC는 ObjC 또는 C++ 예외가 ObjC++ 코드를 던지는 동안 메모리를 누설하지 않지만, 이는 시간과 공간 성능 모두를 희생시킵니다.이것은 ObjC++의 사용을 최소화해야 하는 많은 이유 중 하나입니다.
ARC는 iPhone OS 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 코드를 별도의 xcode 프로젝트로 이동해야 합니다.
결론적으로, 가능한 한 빨리 ARC로 전환하고 절대 뒤를 돌아보지 마세요.
편집
저는 "ARC를 사용하는 것은 코코아 메모리 관리 규칙을 아는 것을 대신할 수 없습니다."라는 대사를 따라 몇 가지 의견을 보았습니다.이것은 대부분 사실이지만, 왜 그리고 왜 그렇지 않은지 이해하는 것이 중요합니다.첫째, 만약 당신의 모든 코드가 ARC를 사용하고 있고, 당신이 곳곳에 있는 세 개의 마법 단어를 위반하더라도, 당신은 여전히 문제가 없을 것입니다.충격적인 얘기지만, 여기 있네요. ARC는 당신이 의도하지 않았던 것들을 보존할 수도 있지만, 그것들도 공개할 것이기 때문에 결코 중요하지 않을 것입니다.제가 오늘 코코아에서 새로운 수업을 한다면, 저는 아마 실제 메모리 관리 규칙에 5분을 넘지 않을 것이고, KVC 명명에 대해 논의하는 동안 메모리 관리 명명 규칙만 언급했을 것입니다.ARC를 사용하면 메모리 관리 규칙을 전혀 배우지 않아도 괜찮은 초보 프로그래머가 될 수 있다고 생각합니다.
하지만 당신은 괜찮은 중간 프로그래머가 될 수 없었습니다.Core Foundation과 올바르게 연결하기 위해서는 규칙을 알아야 하며, 모든 중간 프로그래머는 어느 시점에서 CF를 처리해야 합니다.그리고 혼합 ARC/MRC 코드에 대한 규칙을 알아야 합니다.void*에 대한 id(KVO를 올바르게 수행해야 합니다.)그블록고음... 음, 블록 블, 메모관그이저상합니다리는리.
따라서 제 요점은 기본 메모리 관리가 여전히 중요하지만, 제가 새로운 프로그래머를 위한 규칙을 진술하고 재작성하는 데 상당한 시간을 할애했던 곳에서 ARC를 사용하여 더욱 발전된 주제가 되고 있다는 것입니다.나는 새로운 개발자들이 그들의 머리를 기본적인 요청으로 채우기 보다는 객체 그래프의 관점에서 생각하도록 하는 것이 낫습니다.objc_retain().
저보다 더 나은 기술적인 답변이 나올 것입니다. 하지만 다음과 같습니다.
- ARC!= 가비지 컬렉션입니다.런타임 패널티는 없으며 컴파일 시간에 수행됩니다.
- ARC도!=는 당신의 의견에 따라 모든 것을 자동으로 해제합니다.문서 읽기
- 수동 참조 관리를 얼마나 많이 했는지 깨닫기만 하면 멋진 일입니다.
- 사용하세요!
- 한 가지 단점 - 오래된 비호 코드를 유지하는 것이 갑자기 매우 지루해집니다.
ARC는 프로젝트에 얼마나 많은 이점을 제공할 수 있습니까?
이러한 장점은 일반적인 메모리 관리 실수로부터 상당한 수준의 보호를 제공합니다.물체를 분리하지 못해 발생하는 누출과 물체를 고정하지 못해 충돌하거나 너무 일찍 분리하지 못해 발생하는 누출을 크게 줄여야 합니다.참조를 강한 것 또는 약한 것으로 분류하고 유지 주기를 방지하는 등의 작업을 수행하려면 여전히 참조 카운트된 메모리 모델을 이해해야 합니다.
쓰레기 수거 비용은 실제로 얼마입니까?
iOS에는 가비지 컬렉션이 없습니다. ARC는 GC와 유사하여 객체를 수동으로 보관하거나 해제할 필요가 없습니다.쓰레기 수거기가 없다는 점에서 GC와 다릅니다.유지/릴리스 모델은 여전히 적용되며 컴파일러가 컴파일 시 사용자를 위해 적절한 메모리 관리 호출을 코드에 삽입합니다.
ARC를 사용해 보셨습니까? 그렇다면 지금까지 어떻게 찾으셨습니까?
참조 카운트에 익숙하다면 약간 당황스럽지만, 그것은 단지 그것에 익숙해지고 컴파일러가 정말로 옳은 일을 할 것이라고 믿는 것을 배우는 것의 문제입니다.Objective-C 2.0과 함께 제공된 속성 변경의 연속인 것처럼 느껴지며, 이는 메모리 관리를 단순화하는 또 다른 큰 단계였습니다.수동 메모리 관리 호출이 없으면 코드가 조금 더 짧아지고 읽기가 쉬워집니다.
ARC의 유일한 문제는 이전 버전의 iOS에서 지원되지 않는다는 것입니다. 따라서 채택하기 전에 이 점을 고려해야 합니다.
ARC가 좋은 생각인 것 같아요.GC와 비교하여, 당신은 당신의 케이크를 먹고 먹을 수 있습니다.저는 MRC가 모든 사람들이 가지고 있는 것으로 이익을 얻을 수 있는 메모리 관리에 대해 귀중한 '훈육'을 부과한다고 생각하는 경향이 있습니다.그러나 실제로 알아야 할 문제는 객체 소유권 및 객체 그래프이며, 낮은 수준의 참조 수 자체가 아니라는 점에도 동의합니다.
결론: ARC는 메모리에 대해 무신경하기 위한 자유 패스가 아닙니다. ARC는 스트레스를 유발하고 오류를 일으키기 쉬운 반복적인 작업을 피할 수 있도록 도와주는 도구이므로 기계(이 경우 컴파일러)에 더 잘 위임됩니다.
그렇긴 하지만, 저는 개인적으로 일종의 장인이고 아직 변화를 이루지 못했습니다.이제 막 Git를 사용하기 시작했어요...
업데이트: 그래서 저는 제 게임 전체를 gl 라이브러리를 포함하고 지금까지 문제가 없었습니다(Xcode 4.2의 마이그레이션 어시스턴트 제외).새 프로젝트를 시작하려면 시작하십시오.
저는 몇 개의 (인정할 수 있는) 소규모 프로젝트에 사용해 본 적이 있으며, 성능과 안정성 측면에서 모두 좋은 경험을 가지고 있습니다.
주의할 점은 UI를 직접 코딩할 경우 참조 루프가 발생하지 않도록 약한 참조의 do:s와 not:s를 학습해야 한다는 것입니다. 이를 사용하여 GUI를 설정하면 디자이너가 자동으로 잘 수행하는 경향이 있습니다.
제가 직면한 유일한 단점은 코어 파운데이션 기능과 데이터가 많은 라이브러리를 사용하는 것입니다.에서는 MRC를 CFStringRef신에대 NSString*ARC는 ARC로 합니까?CoreFoundation 개체를 해제하고 ARC로 이동하시겠습니까?코코아 개체를 +1 CoreFoundation 보존 개체로 만드시겠습니까?)또한 OS X에서는 64비트 코드에서만 사용할 수 있습니다(비록 이와 관련된 헤더가 있긴 하지만…).
언급URL : https://stackoverflow.com/questions/8760431/to-arc-or-not-to-arc-what-are-the-pros-and-cons
'codememo' 카테고리의 다른 글
| Gemfile.lock 파일 이해 (0) | 2023.06.02 |
|---|---|
| clearfix'의 어떤 방법을 사용할 수 있습니까? (0) | 2023.06.02 |
| 오토매퍼: "나머지는 무시하세요"? (0) | 2023.06.02 |
| 앱에 대한 푸시 알림 설정 재설정 (0) | 2023.06.02 |
| 그룹화된 테이블 뷰 셀의 배경/경계 색상을 사용자 지정하는 방법은 무엇입니까? (0) | 2023.06.02 |