developer tip

ARC로 또는 ARC로?

optionbox 2020. 7. 27. 07:51
반응형

ARC로 또는 ARC로? 장단점은 무엇입니까? [닫은]


현재 작업중 인 프로젝트의 대부분의 코드가 iOS 5.0 이전에 작성되었으므로 아직 ARC를 사용하지 않았습니다.

궁금한 점이 있습니다. 수동으로 유지 / 방출하지 않는 편의성 (그리고 아마도 더 신뢰할 수있는 코드는 무엇입니까?)이 ARC 사용의 비용보다 중요합니까? ARC에 대한 귀하의 경험은 어떻습니까?

그래서:

  • ARC는 프로젝트에 얼마나 많은 혜택을 줄 수 있습니까?
  • ARC에 Java의 가비지 콜렉션과 같은 비용이 있습니까?
  • ARC를 사용하고 있습니까? 그렇다면 지금까지 어떻게 찾았습니까?

단점은 없습니다. 그걸 써. 오늘 해 이전 코드보다 빠릅니다. 이전 코드보다 안전합니다. 이전 코드보다 쉽습니다. 가비지 콜렉션이 아닙니다. GC 런타임 오버 헤드가 없습니다. 컴파일러는 어쨌든 가져야 할 모든 위치에 유지 및 릴리스를 삽입합니다. 그러나 그것은 당신보다 똑똑하고 실제로 필요하지 않은 것을 최적화 할 수 있습니다 (루프를 풀고 임시 변수, 인라인 함수 등을 제거 할 수있는 것처럼)

이제 작은 단점에 대해 말씀 드리겠습니다.

  • 오랜 ObjC 개발자 인 경우 ARC 코드가 표시 될 때 약 일주일 동안 작동합니다. 당신은 이것을 매우 빨리 극복 할 것입니다.

  • 핵심 재단 코드와의 연계에는 약간의 복잡한 문제가 있습니다. 아무것도 처리에 더 많은 합병증이 약간 있다는 것을 취급합니다 idA와 void*. C- 어레이와 같은 것들은 id올바르게하기 위해 조금 더 생각할 수 있습니다. ObjC의 팬시 처리 va_args는 또한 문제를 일으킬 수 있습니다. ObjC 포인터에서 수학과 관련된 대부분의 작업은 더 까다 롭습니다. 어떤 경우에도 이것을 많이 가지고 있으면 안됩니다.

  • 당신은 넣을 수 없습니다 idA의 struct. 이것은 매우 드물지만 때로는 데이터를 포장하는 데 사용됩니다.

  • 올바른 KVC 명명을 따르지 않고 ARC 코드와 비 ARC 코드를 혼합하면 메모리 문제가 발생합니다. ARC는 KVC 명명을 사용하여 메모리 관리에 대한 결정을 내립니다. 그것이 모두 ARC 코드라면, 그것은 양쪽에서 같은 "틀린"것을 할 것이기 때문에 중요하지 않습니다. 그러나 ARC / 비 ARC가 혼합되어 있으면 불일치가 있습니다.

  • ObjC 예외 발생시 ARC에서 메모리가 누출됩니다. ObjC 예외는 프로그램 종료와 매우 밀접한 관계가 있어야합니다. 많은 수의 ObjC 예외가 발생하면 잘못 사용하고 있습니다. 이는를 사용하여 해결할 수 -fobjc-arc-exceptions있지만 아래에 설명 된 위약금이 발생합니다.

  • ARC는 ObjC ++ 코드에서 ObjC 또는 C ++ 예외가 발생하는 동안 메모리를 누설하지 않지만 시간과 공간 성능이 모두 저하됩니다. 이것은 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를 사용하는 것이 코코아 메모리 관리 규칙을 아는 것의 대체물이 아닙니다"라는 문구에 따라 몇 가지 의견을 보았습니다. 이것은 대부분 사실이지만 그 이유와 이유를 이해하는 것이 중요합니다. 먼저 모든 코드가 ARC를 사용하고 Three Magic Words 를 위반하면사방에, 당신은 여전히 ​​문제가 없습니다. 놀랍지 만 거기에 있습니다. ARC는 당신이 그것을 유지하려고 의도하지 않았던 것들을 보유 할 수도 있지만, 그것들도 릴리스 할 것이므로 결코 중요하지 않습니다. 오늘 Cocoa에서 새로운 수업을 가르치고 있다면 실제 메모리 관리 규칙에 5 분 이상을 투자하지 않았을 것입니다. KVC 명명에 대해 이야기하면서 메모리 관리 명명 규칙에 대해서만 언급했을 것입니다. ARC를 사용하면 실제로 메모리 관리 규칙을 배우지 않고도 괜찮은 초보자 프로그래머가 될 수 있다고 생각합니다.

그러나 당신은 괜찮은 중급 프로그래머가 될 수 없었습니다. Core Foundation과 올바르게 브리지하려면 규칙을 알아야하며 모든 중급 프로그래머는 특정 시점에서 CF를 처리해야합니다. 혼합 ARC / MRC 코드에 대한 규칙을 알아야합니다. 그리고 KVO를 올바르게 수행해야하는 void*포인터로 혼란을 시작할 때 규칙을 알아야합니다 id. 그리고 블록 ... 글쎄, 블록 메모리 관리는 이상합니다.

따라서 핵심 메모리 관리는 여전히 중요하지만, 새로운 프로그래머를위한 규칙을 설명하고 복원하는 데 상당한 시간을 소비했던 곳에서 ARC를 사용하면 더욱 발전된 주제가되고 있습니다. 차라리 새로운 개발자가 객체 호출에 대한 기본 호출로 머리를 채우는 대신 객체 그래프로 생각하게하십시오 objc_retain().


내 것보다 더 많은 기술적 답변이 올 것입니다.

  • ARC! = 가비지 콜렉션. 런타임 페널티는 없으며 컴파일 타임에 수행됩니다.
  • ARC는! = 의견에서 제안한 것처럼 모든 것을 자동으로 해제합니다. 문서를 읽으십시오
  • 그것은 당신이 얼마나 설명서를 참조 관리 실현되면 끝내 일을
  • 그걸 써!
  • 하나의 단점-오래된 비 아크 코드를 유지하는 것은 갑자기 매우 지루합니다.

ARC는 프로젝트에 얼마나 많은 혜택을 줄 수 있습니까?

The benefit is a significant degree of protection from common memory management mistakes. Leaks caused by failing to release an object and crashes due to failing to retain or prematurely releasing an object should be significantly decreased. You still need to understand the reference counted memory model so that you can classify your references as strong or weak, avoid retain cycles, and so on.

How much does garbage collection really 'cost'?

There is no garbage collection in iOS. ARC is similar to GC in that you don't have to manually retain or release objects. It's unlike GC in that there's no garbage collector. The retain/release model still applies, it's just that the compiler inserts the appropriate memory management calls into your code for you at compile time.

Have you been using ARC and if so, how have you found it so far?

It's a little disconcerting if you're used to reference counting, but that's just a matter of getting used to it and learning to trust that the compiler really will do the right thing. It feels like a continuation of the change to properties that came with Objective-C 2.0, which was another big step toward simplifying memory management. Without the manual memory management calls, your code becomes a little shorter and easier to read.

The only issue with ARC is that it's not supported in older versions of iOS, so you need to take that into account before you decide to adopt it.


I think ARC is a great idea. Compared to GC, you can have your cake and eat it too. I tend to believe that MRC imposes an invaluable 'discipline' towards memory management that everyone would benefit from having. But I also agree that the real issue to be aware of is Object Ownership and Object Graphs (as many have pointed out), and not low-level reference counts per se.

To conclude: ARC is NOT a free pass to be mindless about memory; it is a tool to help humans avoid repetitive tasks, that cause stress and are prone to error, therefore better delegated to a machine (the compiler, in this case).

That said, I'm personally kind of a craftsman and haven't made the transition yet. I just started using Git...

UPDATE: So I migrated my whole game, gl library included, and no problems so far (except with the migration assistant in Xcode 4.2). If you are starting a new project, go for it.


I've used it in a couple of (admittedly small) projects, and I have only good experiences, both performance- and reliability wise.

One minor note of caution is that you need to learn the do:s and don't:s of weak references not to cause any reference loops if you're coding your UI by yourself, the designer tends to do a good job of it automatically if you set up your GUI using it.


The only downside I have encountered is if you use a library with a lot of CoreFoundation functions and data. In MRC you didn't need to worry about using a CFStringRef instead of an NSString*. In ARC, you have to specify how the two interact (basic bridge? release the CoreFoundation object and move it to ARC? Make a Cocoa object as a +1 CoreFoundation retained object?) Also, on OS X, it's only available on 64-bit code (Although I do have a header that works around that…).

참고URL : https://stackoverflow.com/questions/8760431/to-arc-or-not-to-arc-what-are-the-pros-and-cons

반응형