iOS5 SDK의 자동 참조 계산에 대한 몇 가지 질문


134

현재 iPad 용 앱을 개발 중입니다. 개발은 iOS 4.2에서 시작되었으며 현재 iOS 4.3에서 계속 진행 중입니다. iOS 5의 ARC에 대해 읽었으며 기본적으로 더 이상 객체를 해제하고 유지할 필요가 없다는 것을 이해했습니다. 내 질문은 :

  1. 나는에서 iOS 5로 업그레이드하기로 결정하면, 나는 모든 제거해야 할 [myObject retain][myObject release]내 코드에서 문을?

  2. ARC를 사용하여 iOS 5 용 새 앱을 개발하는 경우 일종의 "레트로 호환성"검사를 구현해야합니까? 즉, iOS 버전을 확인하고 그에 따라 통화를 유지하고 해제해야합니까? 기본적으로 ARC는 모든 iOS 버전 또는 iOS 5에서만 사용할 수 있습니까?

답변:


150

iOS 5로 업그레이드하기로 결정한 경우 코드에서 [myObject retain] 및 [myObject release] 문을 모두 제거해야합니까?

예. 그러나 XCode 4.2에는 새로운 "Objective-C ARC로 마이그레이션"도구 (편집-> 리 팩터 메뉴에 있음)가 포함되어 있습니다. dealloc 호출은 다른 이야기입니다. 주석에서 언급했듯이 clang 참조는 dealloc 메소드를 유지해야한다고 명시합니다.

이론적 근거 : ARC가 인스턴스 변수를 자동으로 파괴하더라도 유지 불가능한 자원 확보와 같은 해제 방법을 작성해야하는 합법적 인 이유가 있습니다. 이러한 방법으로 [super dealloc]을 호출하지 못하는 것은 거의 항상 버그입니다.

새로운 -fobjc-arc 컴파일러 플래그를 사용하여 ARC를 활성화합니다. ARC는 Mac OS X v10.6 및 v10.7 (64 비트 응용 프로그램) 및 iOS 4 및 iOS 5 용 Xcode 4.2에서 지원됩니다 (Mac OS X v10.6 및 iOS 4에서는 약한 참조가 지원되지 않음). Xcode 4.1에서는 ARC 지원이 없습니다.

-

ARC를 사용하여 iOS 5 용 새 앱을 개발하는 경우 일종의 "레트로 호환성"검사를 구현해야합니까? 즉, iOS 버전을 확인하고 그에 따라 통화를 유지 및 해제해야합니까? 기본적으로 ARC는 모든 iOS 버전 또는 iOS 5에서만 사용할 수 있습니까?

ARC는 런타임이 아닌 컴파일 타임에 마법을 수행하기 때문입니다.

ARC는 언제 유지, 해제 및 자동 릴리스를 사용해야하는지 기억할 필요없이 객체의 수명 요구 사항을 평가하고 컴파일 타임에 적절한 메소드 호출을 자동으로 삽입합니다. 컴파일러는 또한 적절한 할당 해제 방법을 생성합니다.

ARC에 대한 추가 정보 : http://clang.llvm.org/docs/AutomaticReferenceCounting.html


설명해 주셔서 감사합니다!
Luke47

4
이것은 100 % 정확하지 않습니다. ARC의 활성화 여부를 결정하는 컴파일러 스위치가 있습니다. 또한 ARC는 약간의 런타임 지원이 필요합니다. 따라서 앱이 iOS 4.x에서 작동하게하려면 유지 및 릴리스 상태를 유지하고 ARC가 꺼져 있는지 확인해야합니다.
JeremyP

8
@JeremyP-iOS 4.0은 실제로 ARC 응용 프로그램의 대상으로 지원되므로 이전 플랫폼을 해결하기 위해 수동 참조 카운트 코드를 유지할 필요가 없습니다. 아마도 아이폰 OS 3.x이지만, 5.0이 나왔을 때 5.0이 출시되면 애플은 타겟 플랫폼으로서의 지원을 중단 할 것이라고 생각한다.
Brad Larson

5
@Brad iOS4의 설치 기반은 이미 95 % 이상입니다. 어쨌든 iOS3 지원을 중단하기 위해 절약한다고 생각합니다.
Henrik P. Hessel 2018 년

2
당신은 제거하지 않는 dealloc당신은 단지 당신의 제거 release들과 [super dealloc]그것에서. 그리고 99.9 % dealloc에서는 객체를 해제하기 만하면 제거 할 수 있습니다. 그러나 개체는 여전히 release파일 정리 , 관찰자 ​​제거 등의 다른 정리 작업을 수행해야합니다 .
Stanislav Yaglo

8

Q1 : 아니요. 기존 코드가있는 경우 -fno-objc-arc 와 같이 그대로 사용하면 파일에서 ARC를 선택적으로 비활성화 할 수 있습니다.

여러 파일에서 ARC비활성화 하려면 다음 을 수행 하십시오 .

  1. Xcode의 Target / Build Phases / Compile Sources에서 원하는 파일을 선택하십시오.
  2. ENTER를 누릅니다 . (두 번 클릭하면 하나의 파일 만 선택)
  3. -fno-objc-arc 유형
  4. Enter 또는 완료를 누르 십시오

Q2 : 아니요, 대상은 iOS 4.0만큼 낮을 수 있습니다


7

내가 이해하고 iOS 5와 iOS 4.3을 실행하는 iPhone / iPod이 각각 작동하는 한, 그것은 모두 자동입니다. 4.0으로 시작하여 iOS 5.0 용 Xcode와 함께 작동하도록 "업데이트 된"앱은 모든 할당 해제 등을 포함하더라도 릴리스 및 유지에 대한 경고를하지 않습니다. 그러나 삽입 한 동일한 코드 중 일부 (파일 복사) iOS 5 용 Xcode로 생성 된 새 프로젝트 에 많은 경고가 있습니다. 따라서 모든 통화를 제거 할 필요는 없으며 이전 버전에 맞게 자동으로 조정됩니다. iPod을 프로파일 링 할 때 메모리 누수 나 다른 할당 해제 / 해제 흔적이 보이지 않습니다. 도움이 되나요?


최신 베타 버전은 실제로 모든 할당 호출을 제거하라는 메시지를 표시합니다. 여전히 유지 / 해제 할 수 있지만 시스템에는 마지막 단어가 있습니다.
Dylan Gattey

5

귀하의 질문 의이 부분에 대해

ARC를 사용하여 iOS 5 용 새 앱을 개발하는 경우 일종의 "레트로 호환성"검사를 구현해야합니까? 즉, iOS 버전을 확인하고 그에 따라 통화를 유지 및 해제해야합니까? 기본적으로 ARC는 모든 iOS 버전 또는 iOS 5에서만 사용할 수 있습니까?

iOS 5 컴파일러는 "retro-compatibility"(실제로 유지 / 릴리스 작업을위한 코드를 ADDS로 사용)를 사용하지만 iOS 5.0 용으로 컴파일하지 않으면 weak키워드로 사용할 수 없습니다. . 대신을 사용 assign합니다. 이것은 불행한 일 weak입니다. 큰 장점입니다 (매달려 포인터가 없습니다!). 내 질문을 참조 여기 의 논의 weak, assign그리고 ARC.


2

새로운 -fobjc-arc 컴파일러 플래그를 사용하지 않고 ARC를 비활성화 할 수 있다면 앞으로 코드를 다시 작성하지 않아도됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.