14

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

@property (weak) IBOutlet WebView *webView;

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

@synthesize webView=_webView;

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

错误:'weak' 属性的 @synthesize 只允许在 ARC 或 GC 模式下使用

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

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

[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -W括号 -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=属性((iboutlet) )" "-DIBOutletCollection(ClassName)=属性((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/Intermediates/[...].build/Debug/[...].build /DerivedSources -F[...]/Build/Products/Debug -fno-objc-arc [...]

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

如果有人知道更简单的方法,我将不胜感激。

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

4

9 回答 9

11

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

@property (weak) IBOutlet WebView *webView;

并且没有 ARC

@property(unsafe_unretained) IBoulet WebView *webView; 
于 2012-12-28T06:21:01.720 回答
6

仅供参考:对于受“@synthesize of 'weak' property is only allowed in ARC or GC mode”错误困扰的任何人:

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

于 2011-11-12T01:32:46.327 回答
2

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

于 2012-06-01T21:19:54.603 回答
1

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

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

于 2011-10-16T17:59:05.990 回答
1

尝试在构建阶段使用 -fobjc-arc 作为编译器标志显式标记

于 2012-10-16T03:27:29.760 回答
0

以防其他人偶然发现:

我刚刚通过在构建设置中将“Objective-C 垃圾收集”设置为“不支持”来解决此问题。由于某种原因,这被设置为 YES,这导致 ARC 构建不起作用。

于 2012-01-20T15:46:01.097 回答
0

好的,以防万一其他人遇到与我相同的问题,我将 UI 元素作为属性添加到 @interface 的结束“}”下方,而不是在内部。一旦我删除了 .h/.m 文件中的 @property 和 @synthesize 条目并重新链接了 @interface{ } 部分中的 UI 元素,它就起作用了。

于 2012-07-10T20:54:39.283 回答
0

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

它已设置为“LLVM GCC 4.2”,在“...编译器 3.0 - 语言”类别下,选择 ARC(“Objective-C 自动引用计数”)的选项甚至不可见。

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

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

于 2013-01-24T00:09:43.317 回答
0

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

于 2013-06-04T09:56:07.417 回答