Xcode 7.3无法使用手动引用计数在文件中创建__weak引用


86

更新到Xcode 7.3后,它将Cannot create __weak reference in file using manual reference counting在pod文件中引发错误。有人解决了这个问题吗?

Answers:


176

设置Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain ReleaseYES

视觉范例

摘自Apple开发者论坛-Xcode 7.3b4(非弧),无法创建__weak reference


7
这仍然对我不起作用:((可能还有另一个编译器标志会覆盖我可能已启用的设置吗?我确实-Wall -Wextra -Wno-unused-parameter启用了这些警告标志。)
Kdawgwilk

6
@Kdawgwilk您确定正确打开了该标志吗?如果它在您的项目中,则只需删除__weak关键字tho。我没有尝试,但是如果您使用Pod,那么您也可以尝试在Pod项目中打开标志
REALFREE

3
请注意,如果您当前正在运行Pod安装/ pod更新,则对于每个Pod目标,“手动保留版本”中的“弱引用”将设置为“否”,并且您将不得不再次编辑构建设置。
Damo

2
我也必须在pod项目设置中执行此操作。
伯纳德2016年

真棒答案。
巴特洛梅耶Semańczyk

21

这是苹果公司通过链接提供的官方答案:

基于以下情况,此问题的行为符合预期:我们正在以所有Objective-C语言模式实现弱引用。由于“ __weak”在非ARC(和非GC)语言模式中一直被忽略,因此我们添加了此错误以指出将来语义将发生变化的地方。请更新您的错误报告,让我们知道这是否仍然是您的问题。

因此,基本上,如果将Pod用于第三方库,则必须删除非ARC中的__weak或等待更新。

更新@ 3/23

我应该更多地研究可以传递给编译器的标志,以便绕过这些东西。但是从根本上说__weak,从现在开始,您就不应该在非ARC模式下使用,以避免任何意外的冲突。对于cocoapods用户,您不需要删除__weak或等待更新,而是Weak References in Manual Retain Release可以像Lean所说的那样将构建设置中的标志设置为YES。希望对您有所帮助。


1
请注意,如果您当前正在运行Pod安装/ pod更新,则对于每个Pod目标,“手动保留版本”中的“弱引用”将设置为“否”,并且您将不得不再次编辑构建设置。
Damo

20

解决此问题的最佳方法是将post_install脚本添加到Podfile中,以将Weak References in Manual Retain Release标记设置yes为所有Pod目标中的。为此,只需将以下代码粘贴到您的代码的底部Podfile

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。您可以通过添加另一个配置选项来解决该问题,并强制所有Pod定位到所需的版本(基于此答案):

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 '16

3
我得到以下错误:当前部署目标不支持-fobjc-weak
g212gs,2016年

我也遇到了-fobjc-weak错误,但设法通过将所有Pod部署目标设置为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.3.2版本中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

只需在“构建阶段”选项卡中转到目标,在“编译源”中查找pod文件,单击这些文件并添加编译器标志“ -fobjc-arc”


0

或更改__weak__unsafeunretained。这将解决传统上的问题。由于MRC(在xCode 4-之前)__weak不在iOS中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.