2011-10-12 1 views
31

ARC가 컴파일 시간이었고 iOS 4와 역 호환 될 것이라고 처음 알게 된 이후로 읽었습니다. 프로젝트를 성공적으로 리팩터링했습니다. Xcode 4.2의 자동 리팩터링을 사용하여 ARC에 추가 할 수 있으며, iOS 5.0 SDK와 비교하여 컴파일하면 정상적으로 작동합니다. 내 아이폰 OS에 대해 컴파일 4.2 SDK를 시도 할 경우, 그것은 다음과 같은 기호 누락 링크시 실패iOS 4에서 ARC가 실제로 지원됩니까? 연결 시간에 iOS 4.2 SDK에 ARC 관련 기호가 누락되었습니다.

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue을
  • _objc_storeStrong
  • _objc_retain
  • 을 _objc_release _objc_retainAutoreleasedReturnValue

나는 확인하고, 해당 기호는 5.0에 존재하지만 4.2 :

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$ 
00005ed0 T _objc_retain 
000061d0 T _objc_retain 

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$ 
[... *crickets* ...] 

이 애플이 거짓말을 의미합니까? 나는 혼란스럽고 잘못된 것을하고 있다고 가정하지만, 나는 무엇을 알아낼 수 없다.

는 ARC은 위의 아이폰 OS 4.3에서 지원됩니다 엑스 코드 4.2 (4C199 빌드)

+0

iOS 4.3이 필요하다고 생각합니다. – ughoavgfhw

+3

다른 사람들이 말한 것 외에 4.2 SDK를 설치하지 마십시오. 5.0 SDK를 사용하십시오. 전개 대상을 설정하십시오. 나는 이것을 의미하지 않는다. 나는 일반적으로 의미한다. 오래된 SDK는 사용하지 않아야합니다. –

+1

와우, 새로운 SDK가 구형 OS 버전 용으로 빌드 될 수 있다는 것을 모른 채 오랫동안 갈 수 없었습니다. 여기에 나는 그들이 오래된 나의 모든 SDK 버전을 삭제했다는 것에 화가났다 :/고마워! –

답변

34

의 GM 릴리스입니다. iOS 5.x SDK를 사용해야하지만 배포 대상으로 iOS 4.3을 선택할 수 있습니다. 4.x에서 지원되지 않는 한 가지는 자동 약한 참조 제로입니다.

Objective-C 기능 가용성 지수는 Apple 설명서 here을 참조하십시오.

Xcode 4.4 및 4.5를 사용하여 앱을 제출할 수 있습니다.

NSDictionary 및 NSArray subscripting은 OS X 10.6 및 iOS 4에 다시 배포되므로 배포 대상도 다시 설정해야합니다.

+0

감사합니다 (facepalm). 그러나 실제로 배포 대상으로 4.2와 함께 작업하는 것으로 보이지만 ...실제 장치에서 테스트 할 것입니다. –

+0

내 장치에서도 iOS 4.2.1을 실행해도 문제가없는 것으로 보입니다. –

+0

거절 당하면 이것을 업데이트하겠습니다. 다시 한번 감사드립니다. –

11

조금 늦었지만 중요한 정보입니다. 허용되는 대답은 ARC 지원을위한 최소 OS 인 Apple states iOS 4.0 and above입니다.

그러나 몇 가지 상황이 발생할 수 있습니다. 그 중 하나는 물론 __weak 키워드이며 파생 상품입니다. 다음과 같은 오류가 표시됩니다. 당신이 NSObject의의 +load 방법을 사용할 때

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak 

두 번째 매우 위험한 상태

이다. iOS 4.x에서 ARC를 사용하여 이렇게하면 런타임 충돌이 발생하여 찾기가 매우 어려워집니다. 다음과 같은 런타임 오류가 발생하면 +load 메소드를 확인하십시오. 나를 위해 그것은 특정 파일에 대해 -fno-objc-arc 플래그를 설정했다.

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue 
+0

당신이 언급 한 그 두 번째 부분이 저를 붙잡 으러 되돌아 왔고,'+ load '에서 충돌합니다. 곧 iOS 4.3을 삭제할 예정이지만, 4.3 ~ 5 또는 6, gaaaah 업데이트를 거부하는 사람들을 위해 작업 업데이트를 하나 더 제공해야합니다. – Pascal