일부 파일에 대한 자동 참조 계산 비활성화


183

iOS 5 SDK를 다운로드했으며 ARC가 새로운 Apple 컴파일러의 훌륭한 기능이라는 것을 알았습니다. 당분간 많은 타사 프레임 워크는 ARC를 지원하지 않습니다. 새 코드에 ARC를 사용하고 현재 보유 / 릴리스 코드를 변경하지 않고 유지할 수 있습니까? JSONKit과 같은 일부 프레임 워크는 변환기를 사용하여 ARC로 변환 할 수 없으므로 ARC 변환기는 여기서 작동하지 않습니다.

편집하다:

대답은 -fno-objc-arcARC를 원하지 않는 파일에 대한 컴파일러 플래그에 추가 하는 것입니다. Xcode 4에서는 대상-> 빌드 단계-> 컴파일 소스 에서이 작업을 수행 할 수 있습니다.



2
명확히하기 위해 .m파일에 추가하면 됩니다. .h파일이 아닙니다 .
ma11hew28

이 대화를 찾았습니다. github.com/gowalla/AFNetworking/issues/36 iOS5 ARC 지원 프로젝트에서 JSONKit을 통합하는 방법을 누군가에게 도움이 될 것입니다 ;-)하지만 지금 시도하지는 않았습니다 ...

이 방법은 저에게 효과적이었습니다. UDP 멀티 캐스트 용 AsyncUdpSocket을 프로젝트에 추가하고 있으며 해당 파일 (최소 현재 버전)이 ARC를 지원하지 않습니다. 그래서 위의 방법을 사용하여 AsyncUdpSocket.m 파일에 컴파일러 플래그를 추가하고 응용 프로그램에서 코드가 제대로 작동하도록 할 수 있습니다.
Ashu Joshi

2
이것은 완벽하게 작동합니다! 세부 사항 : 대상으로 이동하여 빌드 단계를 선택한 다음 소스 컴파일을 선택하십시오. 해당 .m 파일을 두 번 클릭하면 다음을 입력 / 붙여 넣을 수있는 상자가 나타납니다. "-fno-objc-arc"
mpemburn

답변:


73

공개 ARC 문서 는이 시점에서 직접 명확하지는 않지만 각 클래스가 모두 ARC이거나 수동으로 관리되는 한 클래스를 단일 프로그램으로 통합 할 수 있다고 제안하는 것 같습니다.

단일 클래스에서는 ARC와 비 ARC 만 혼합 할 수 없습니다. 문서를 말한다 전송 retain, release, autorelease, 또는 retainCount(타이머 사용 지연 수행을 포함하여 어떤 방법으로 메시지 @selectorARC 코드 금지). 따라서 ARC 클래스에서는 ARC 이외의 작업을 수행 할 수 없으며 (필요한 메시지가 금지되기 때문에) ARC 이외의 클래스에서는 ARC를 수행 할 수 없습니다 (ARC가 ARC없이 유효하지 않은 구문 요소를 추가하기 때문에).

ARC 이외의 라이브러리 / 프레임 워크를 ARC 프로그램에 통합 할 수 있는지 여부에 대해 동일한 문서가 약간 더 명확합니다. 예. 모든 코드가 ARC가 아닌 프로그램에서 ARC 라이브러리 / 프레임 워크를 사용할 수 있는지 여부는 언급하지 않지만 위의 모든 사항을 고려하면 의미가 예인 것 같습니다.


감사합니다! 기존의 비 ARC 클래스에 대해 ARC를 비활성화하는 방법을 알아 냈습니다.
nonamelive

당신이하고있는 일을 우리와 공유 할 수 있습니까?
David H

1
@David H : 질문자에게 문제를 해결하려면 질문자가 질문에 대한 솔루션을 편집했음을 유의해야합니다.
Peter Hosey

HEADER 파일에서 ARC 컴파일을 비활성화 할 수 없습니다. Clang은 구현 / 메소드 파일의 컴파일을 기반으로 인터페이스 / 헤더를 컴파일하지 않습니다. 따라서 헤더 파일은 혼합 컴파일에서 ARC 및 비 ARC와 호환되어야합니다. 나는 이것을 컴파일러의 버그로 본다.
carmin

1
@ 카민 : 그렇지 않습니다. 컴파일러는 사용자가 지시 한 경우를 제외하고 헤더 파일을 보지 않습니다. 일반적으로 #import모듈 파일 에서만 헤더 파일을 사용하여 수행 합니다. 컴파일러 플래그 설정은 각 모듈 파일에 대한 것입니다 (보다 정확하게는 "컴파일 소스"빌드 단계의 각 파일). 컴파일러는 다른 파일에 대해 ARC를 사용해야하는지 여부를 알 수있는 방법이 없습니다. 단, 시작한 모듈 파일에 대해 선택한 사항을 상속하는 경우를 제외하고.
피터 호세이

78

MULTIPLE 파일에서 ARC를 비활성화하는 방법은 매우 직관적이지 않습니다 . 잠깐 동안 나는 그것을 수행하는 방법을 알아낼 때까지 하나씩 수행했습니다.

  1. Xcode의 Target / Build Phases / Compile Sources에서 원하는 파일을 선택하십시오 (CMD + 클릭 또는 Shift + 클릭)
  2. ENTER를 누르 십시오 (두 번 클릭하면 선택 항목이 재설정되므로 작동하지 않습니다)
  3. -fno-objc-arc 유형
  4. Enter 또는 완료를 누르십시오

1
그것은 실제로 여기에서 묻는 질문에 대한 대답이 아니라 어쨌든 피의 좋은 팁입니다! +1
Kristof Van Landschoot가

당신 말이 맞아요,하지만 난 항상 스위치를 검색 하고이 대답은 최고 인기 중 하나입니다. 나는 요즘 대부분의 사람들이 이미 답을 알고 있지만이 "팁"을 알지 못한다고 생각했다
Tibidabo

35

일부 파일에 대해 자동 참조 계산을 사용하지 않으려면 단계를 수행하는 것이 정말 간단합니다. 대상-> 빌드 단계-> 컴파일 소스에 컴파일러 플래그를 추가하십시오.

xcode

사용 된 플래그는 -fno-objc-arc 입니다. 기록한 후 Enter를 누르십시오.! 컴파일러 플래그 아래 행의 오른쪽 열을 두 번 클릭해야합니다. 그것이 도움이되기를 바랍니다 :)


14
플래그를 사용하여 동일한 방법을 사용 하여 비 ARC 프로젝트의 특정 파일에서 ARC 를 활성화 할 수 있습니다 -fobjc-arc.
lnafziger

HEADER 파일에서 ARC 컴파일을 비활성화 할 수 없습니다. Clang은 구현 / 메소드 파일의 컴파일을 기반으로 인터페이스 / 헤더를 컴파일하지 않습니다. 따라서 헤더 파일은 혼합 컴파일에서 ARC 및 비 ARC와 호환되어야합니다. 나는 이것을 컴파일러의 버그로 본다.
carmin

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