ARC和弱IBOutlet属性

Jac*_*que 14 objective-c xcode4.2 automatic-ref-counting

我刚刚更新了一个项目,使用ARC和Xcode 4.2内置转换工具.不幸的是,有一个奇怪的错误出现,我不明白,也没有找到任何关于.我有一个带有属性声明的文档类:

@property (weak) IBOutlet WebView *webView;
Run Code Online (Sandbox Code Playgroud)

在实现文件中,我有一个@synthesize语句:

@synthesize webView=_webView;
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,它会失败并告诉我:

错误:仅在ARC或GC模式下允许'弱'属性的@synthesize

当然,该项目被标记为使用ARC进行编译.我非常感谢任何帮助,以了解我做错了什么以及为什么.

编辑:昨天晚了.所以这是一个更完整的编译日志:

[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wharentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Whorten-64- to-32 -DDEBUG = 1 -isysroot /Developer/SDKs/MacOSX10.7.sdk -fasm-blocks -mmacosx-version-min = 10.7 -gdwarf-2 -Wno-sign-conversion"-DIBOutlet = attribute((iboutlet) )""-DIBOutletCollection(ClassName)= attribute((iboutletcollection(ClassName)))"" - DIBAction = void)属性((ibaction)" - iquote [...]/Build/Intermediates/[...].build /Debug/[...].build/[...]-generated-files.hmap -I [...]/Build/Intermediates/[...].build/Debug/[...]. build /[...]- own-target-headers.hmap -I [...]/Build/Intermediates/[...] .build/Debug/[...].build/[...] -all-target-headers.hmap -iquote [...]/Build/Intermediates/[...] .build/Debug/[...].build /[...]- project-headers.hmap - 我[/]/Build/Products/Debug/include -I [...]/Build/Intermediates/[...].build/Debug/[...].build/DerivedSources/x86_64 -I [ ...] /编译/中间体/ [...].构建/调试/ [...].构建/ DERI vedSources -F [...]/Build/Products/Debug -fno-objc-arc [...]

似乎ARC的编译器设置在开始时打开,稍后在参数列表中再次关闭.说实话:我不知道在哪里删除这些奇怪的设置以及它是如何实现的.我现在想出的唯一解决方案是从一个空白的新项目启动整个项目,并从头开始导入所有类文件.

如果有人知道更简单的方式,我会非常感激.

PS:我确实将所有关于ARC的构建设置设置为YES.

Pet*_*ker 11

只有ARC我们必须使用weak属性,在没有ARC的情况下,我们必须使用unsafe_unretained它,这与ARC必须使用的方法相同

@property (weak) IBOutlet WebView *webView;
Run Code Online (Sandbox Code Playgroud)

没有ARC

@property(unsafe_unretained) IBoulet WebView *webView; 
Run Code Online (Sandbox Code Playgroud)


小智 6

仅供参考:对于任何受"弱势"属性@synthesize困扰的人,只允许在ARC或GC模式下使用"错误:

如果您已经尝试了此线程中建议的所有解决方案但仍然无法构建,请尝试关闭Xcode项目(文件>关闭项目),然后重新打开项目并再次尝试构建.


Jac*_*que 1

今天我花了更多时间,对项目之前的提交进行了新的转换。这次一切都很顺利。我认为这个错误是由于我尝试分两个步骤进行转换而出现的。该项目分为 2 个部分。我想分别转换它们。这就是为什么我在第一次转换运行期间没有选择所有文件的原因。令我惊讶的是,第一次转换非常顺利,而且时间比我预期的要短。所以我决定也转换该项目的第二个组件。我最终得到的项目状态被描述为上述问题:冲突的构建设置。

一个好的建议可能是不要尝试逐步转换项目,而是多花一些时间立即完成。我必须假设:Xcode 的转换功能可能不适合这样的过程。

  • 这确实是理所当然的。如果您分步骤进行转换,则需要在从初始转换步骤中排除的文件上设置 -fno-objc-arc 标志。编译器抱怨说,尚未标记为 ARC 兼容的文件。这篇文章非常全面地介绍了它>> http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/ (2认同)