2013-05-16 2 views
-2

ARC 기술이 내 프로젝트에서 사용되지 않습니다. 나는 그것에 SBJson 라이브러리를 추가하려고합니다. SBJson 접두어를 가진 모든 파일에 대해 -fobjc-arc 플래그를 설정했지만 컴파일 프로세스 동안 ARC 의미 론적 문제 (명시 적 소유권이없는 비 const 유형의 'id'에 대한 포인터)가 SBJSon과 관련이없는 하나의 클래스 헤더에 나타납니다. 왜 작동하지 않습니까? 오류와ARC가 아닌 프로젝트에서 ARC 라이브러리 사용

라인 :

id *_controls; 

내가 때문에 프로젝트의 상용 라이센스의 당신이 내 코드를 표시 할 수 없습니다, 나는 당신의 이해를 주셔서 감사합니다.

이 라이브러리의 이전 버전을 사용할 때 (ARC없이) 프로젝트 컴파일이 정상적으로 진행됩니다.

+0

적어도 오류의 줄을 줄 수 있습니까 – Ushan87

+0

시도해보십시오 _controls; * – Ushan87

+0

SBJson 파일에만'-fobjc-arc'을 설정했다면, 왜 ARC로 컴파일 된 코드'id * _controls; –

답변

3

문제는 포함을 통해 ARC 위반 파일을 ARC 파일로 혼합한다는 것입니다. 하나의 헤더 파일에 -fno-objc-arc을 적용 할 수 없습니다. 이유가 없습니다.

헤더 파일에 있기 때문에 #if pragma를 사용하여 ARC 또는 non-ARC .m 파일의 컴파일 여부에 따라 동작을 전환해야합니다.

그러나 더 나은 해결책은 ARC 및 비 ARC 모두에 대한 문제를 완전히 없애는 것입니다. 그 선언을 감안할 때, 꽤 많이 인스턴스 변수가되어야합니다 (구조체에있을 수도 있음).

ivar 인 경우 선언을 완전히 제거하십시오. @property을 통해 공개하거나 공개 API에 공개 할 필요가없는 경우 .m 파일로 이동하십시오. 유형을 감안할 때 실제로 내용을 좀 덜 포인터 매직에 액세스하게하는 공용 API를 사용하는 개인 구현 세부 사항이어야합니다.


일반적으로 C 언어 배열 (포인터 배열)을 사용하면 Objective-C 형식을 저장할 수 없습니다. _controls을 공개적으로 액세스 가능한 것으로 공개해야하는 경우 (프로젝트의 다른 클래스에 공개) 컬렉션 클래스를 사용하도록 코드를 리팩토링하십시오 (예 : 일반적으로 NSArray* 게터와 내부 전용 NSMutableArray* 백업 저장소 - 예 : subviews on UIView).

0

주석에서 언급했듯이 미리 컴파일 된 헤더 파일에는 ARC로 컴파일 할 수없는 클래스 헤더 파일이 포함되어 있습니다. 이것은 미리 컴파일 된 헤더가 ARC로 컴파일 된 모든 SBJson 파일에도 포함되므로 오류의 원인입니다.

.pch 파일에서 해당 클래스 헤더 파일을 제거하고 필요하면 ARC가 아닌 원본 파일에서만 포함시키는 것이 좋습니다.

+0

아쉽게도 .pch에서이 파일을 삭제할 수 없습니다. 하지만 SBJSon의 정적 라이브러리를 사용하기로 결정했습니다. – alexeyB