ARC和弱IBOutlet属性

时间:2011-10-15 19:49:45

标签: objective-c automatic-ref-counting xcode4.2

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

@property (weak) IBOutlet WebView *webView;

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

@synthesize webView=_webView;

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

  

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

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

编辑:昨天晚了。所以这里有一个更完整的编译日志:

  

[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wharentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Wshorten -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 -I [...] / Build / Products / Debug / include -I [...] / Build / Intermediates / [...]。build / Debug / [...]。build / DerivedSources / x86_64 -I [...] / Build /中间体/ [...]。build / Debug / [...]。build / DerivedSources -F [...] / Build / Products / Debug -fno-objc-arc [...]

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

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

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

9 个答案:

答案 0 :(得分:11)

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

@property (weak) IBOutlet WebView *webView;

和没有ARC

@property(unsafe_unretained) IBoulet WebView *webView; 

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

对于遇到此问题的其他任何人,如果您将项目转换为ARC的部分,请确认您对其抱怨的文件没有-no-obj-arc标记。

答案 3 :(得分:1)

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

一个好的建议可能不是尝试逐步转换项目,而是花费更多时间并立即执行。我必须假设:Xcode的转换函数可能不适用于这样的过程。

答案 4 :(得分:1)

尝试使用-fobjc-arc显式标记为Build Phases

中的编译器标志

答案 5 :(得分:0)

如果有其他人绊倒了这个:

我刚刚通过在Build Settings中将“Objective-C Garbage Collection”设置为“Unsupported”来修复此问题。由于某种原因,这被设置为YES,这导致ARC构建不起作用。

答案 6 :(得分:0)

好的,以防万一其他人和我有同样的问题,我在我的@interface的结尾“}”下面添加了UI元素作为属性,而不是在里面。删除.h / .m文件中的@property和@synthesize条目并重新链接@interface {}部分中的UI元素后,它就可以了。

答案 7 :(得分:0)

在我的情况下,我发现将“构建选项”类别中的构建设置“C / C ++ / Objective-C编译器”更改为默认值(“Apple LLVM编译器3.0”)解决了此问题。

它被设置为“LLVM GCC 4.2”,并且在“...... complier 3.0 - Language”类别下,选择ARC(“Objective-C自动引用计数”)的选项甚至都不可见

这特别奇怪,因为我有一个以前转换为ARC的项目,虽然所选的编译器也是“LLVM GCC 4.2”,但是“语言”类别仍然标题为“Apple LLVM编译器3.0”,并且选项为选择ARC是可见的。

选择了相同的编译器,但为该编译器提供了不同的选项。怪异。

答案 8 :(得分:0)

我也遇到了同样的问题。我犯的错误是在Build Phases中 - >编译源我将非ARC文件的标志设置为“-fno-objc-arc”。我希望它添加到非ARC文件中。我删除了它,它开始正常工作。