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

时间:2016-03-22 06:33:32

标签: objective-c xcode cocoapods

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

7 个答案:

答案 0 :(得分:173)

else if (this.comparePos(this.node.position, this.flags[this._currentMove].position) 设为Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release

Visual example

取自Apple Developers Forums - Xcode 7.3b4, non-arc, cannot create __weak reference

答案 1 :(得分:20)

这是来自Apple的官方回答:

  

此问题的行为基于以下内容:我们在   在所有Objective-C语言中实现弱引用的过程   模式。因为“__weak”在非ARC(和   非GC)语言模式,我们添加了这个错误来指出地方   语义将来会改变的地方。请更新您的错误   报告告诉我们这是否仍然是您的问题。

所以基本上,如果你将Pod用于第三方库,你必须在非ARC中删除__weak或等待更新。

更新@ 3/23

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

答案 2 :(得分:20)

解决此问题的最佳方法是在您的Podfile中添加post_install脚本,将所有pod目标中的Weak References in Manual Retain Release标记设置为yes。为此,只需将以下代码粘贴到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定位到您想要的版本(based on this answer):

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

答案 3 :(得分: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如何找到那个神奇的话。 Valid XHTML

答案 4 :(得分:7)

我找到了这个。

我想这意味着删除__weak

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

  呃,在MRR [手动保留 - 释放]下,有没有像弱变量引用这样的东西? " __弱"意味着两件事中的一件或两件:

     
      
  1. 无主参考(即不代表保留计数)。

  2.   
  3. 归零引用(即当引用的对象被释放时运行时为零)。

  4.         

    #1不适用于MRR,因为您无论如何都不会保留变量。

         

    #2也不适用于MRR,因为运行时支持在GC和ARC [自动引用计数]中,您不会使用它。

         

    听起来好像编译器现在只是在抱怨它无法做到它从未做过的事情。 (对于应用程序委托,您无法在运行时分辨出差异,因为应用程序委托通常永远不会被释放。)

答案 5 :(得分:1)

只需转到“Build Phases”选项卡中的目标,在“Compile Sources”中查找pod文件,单击这些文件并添加编译器标志“-fobjc-arc”

答案 6 :(得分:0)

或将__weak更改为__unsafeunretained。这将解决传统问题。由于MRC(在xCode 4 - 之前)__ weak不在iOS中。