[objective-c] Xcode 7.3은 수동 참조 계산을 사용하여 파일에 __weak 참조를 만들 수 없습니다.

Xcode 7.3으로 업데이트 한 후 Cannot create __weak reference in file using manual reference counting포드 파일에 오류가 발생 합니다. 누구든지이 문제를 해결 했습니까?



답변

로 설정 Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release합니다 YES.

시각적 예

에서 촬영 애플 개발자 포럼 – 엑스 코드 7.3b4, 비 아크, __weak 참조를 만들 수 없습니다 .


답변

이것은 링크에서 Apple의 공식 답변입니다.

이 문제는 다음에 따라 의도 한대로 작동합니다. 모든 Objective-C 언어 모드에서 약한 참조를 구현하는 중입니다. “__weak”은 역사적으로 비 ARC (및 비 GC) 언어 모드에서 무시되었으므로이 오류를 추가하여 향후 의미 체계가 변경 될 위치를 지적했습니다. 버그 보고서를 업데이트하여 이것이 여전히 문제인지 알려주십시오.

따라서 기본적으로 타사 라이브러리에 Pod를 사용하는 경우 비 ARC에서 __weak을 삭제하거나 업데이트를 기다려야합니다.

업데이트 @ 3/23

이런 종류의 것들을 우회하기 위해 컴파일러에게 전달할 수있는 플래그에 대해 더 많이 조사해야했습니다. 그러나 근본적으로 __weak예기치 않은 충돌을 피하기 위해 지금부터 비 ARC 모드에서 사용해서는 안됩니다 . cocoapods 사용자의 경우 __weak업데이트 를 삭제 하거나 기다릴 필요가 없지만 Weak References in Manual Retain ReleaseLean이 말한 것처럼 빌드 설정의 플래그를 YES로 설정하십시오. 이 도움을 바랍니다.


답변

이 문제를 해결하는 가장 좋은 방법 은 모든 포드 대상에서 플래그를 로 post_install설정 하는 스크립트를 Podfile 에 추가하는 것 입니다. 그렇게하려면 .Weak References in Manual Retain ReleaseyesPodfile

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
        end
    end
end

때때로 그렇게하면 오류가 발생 -fobjc-weak is not supported on the current deployment target합니다. 다른 구성 옵션을 추가하여 모든 포드가 원하는 버전을 대상으로하도록 강제 하여이 문제를 해결할 수 있습니다 ( 이 답변을 기반으로 함 ).

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
        end
    end
end


답변

FBSettings.m에서 Facebook 약한 참조에 대한 해결 방법

Podfile에는 pod 설치 / 업데이트 후 실행할 스크립트를 작성할 수 있으며, 거기에 다음을 설명합니다.

 
post_install do | installer |
     classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
     classy_pods_target.build_configurations.each do | config |
         config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
     end
 end

CLANG_ENABLE_OBJC_WEAK 마법의 단어를 찾는 방법.
유효한 XHTML.


답변

나는 이것을 발견했다.

__weak 삭제를 의미하는 것 같아요

https://forums.developer.apple.com/thread/38934

음, MRR [수동 유지 해제]에서 약한 변수 참조와 같은 것이 있었습니까? “__weak”은 다음 두 가지 중 하나 또는 둘 다를 의미합니다.

  1. 소유되지 않은 참조 (즉, 보유 횟수를 나타내지 않음).

  2. 제로화 참조 (즉, 참조 된 객체가 할당 해제 될 때 런타임이 제로화 됨).

# 1은 MRR에 적용되지 않습니다. 어쨌든 변수를 유지하지 않기 때문입니다.

# 2는 MRR에도 적용되지 않습니다. 런타임 지원은 사용하지 않는 GC 및 ARC [자동 참조 계산]에 있기 때문입니다.

컴파일러가 이제는 결코 할 수없는 일을 할 수 없다고 불평하는 것 같습니다. (그리고 앱 델리게이트의 경우 일반적으로 앱 델리게이트가 할당 해제되지 않기 때문에 런타임에 차이를 알 수 없습니다.)


답변

“Build Phases”탭에서 대상으로 이동하여 “Compile Sources”에서 포드 파일을 찾고 해당 파일을 클릭 한 다음 컴파일러 플래그 “-fobjc-arc”를 추가하십시오.


답변

또는로 변경 __weak하십시오 __unsafeunretained. 이것은 전통의 문제를 해결할 것입니다. MRC (xCode 4 이전-) 이후 __weak은 iOS에 없었습니다.