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


86

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

답변:


176

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

시각적 예

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


7
이것은 여전히 나를 위해 작동하지 않습니다 :( 나는 내가이해야합니까 활성화 할 수 있음이 설정보다 우선 다른 컴파일러 플래그가 될 수 있을까? -Wall -Wextra -Wno-unused-parameter활성화 경고 플래그를.
Kdawgwilk

6
@Kdawgwilk 해당 플래그를 올바르게 설정 하시겠습니까? 프로젝트에서 __weak 키워드 tho를 간단히 삭제할 수 있습니다. 나는 시도 didnt는하지만 당신은 당신이 포드 사용하는 경우 포드 프로젝트의 플래그를 설정하는 시도 할 수 있습니다
realfree에

3
현재 pod install / pod update를 실행하고 있다면 수동 유지 릴리스의 Weak References가 각 pod 대상에 대해 NO로 설정되어 있으므로 빌드 설정을 다시 편집해야합니다.
Damo

2
포드 프로젝트 설정에서도이 작업을 수행해야했습니다.
Bernard

멋진 답변들.
Bartłomiej Semańczyk

21

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

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

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

업데이트 @ 3/23

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


1
현재 pod install / pod update를 실행하고 있다면 수동 유지 릴리스의 Weak References가 각 pod 대상에 대해 NO로 설정되어 있으므로 빌드 설정을 다시 편집해야합니다.
Damo

20

이 문제를 해결하는 가장 좋은 방법 은 모든 포드 대상에서 플래그를 로 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

좋은 생각입니다! Cocoapods를 사용하고 있기 때문에 저에게 효과적입니다. 감사.
mginius

3
다음 오류가 발생했습니다. -fobjc-weak은 현재 배포 대상에서 지원되지 않습니다
g212gs

-fobjc-weak 오류도 발생했지만 모든 포드 배포 대상을 8.3 (내 프로젝트 배포 대상)으로 설정하여 문제를 해결했습니다. 위의 두 번째 스크립트에서 제안한대로 스크립트로 수행 할 수 있습니다.
Xys

8

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.


1
참고 : FB가 3.x 릴리스 라인에 대해 v3.24.4에서 문제가되는 라인을 변경 한 것 같습니다. (지금 거기 좋아하지 확인 4.x의 시리즈에 대해,하지만 보이지 않는다.)
big_m

7

나는 이것을 발견했다.

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

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

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

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

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

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

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

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


1

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


0

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

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