从属性中省略/删除“强”属性时发出警告?
Posted
技术标签:
【中文标题】从属性中省略/删除“强”属性时发出警告?【英文标题】:Warning when omitting / removing 'strong' attribute from Property? 【发布时间】:2014-03-24 15:06:35 【问题描述】:阅读ProgrammingWithObjectiveC,我可以说:
不需要明确指定 strong 属性,因为它是默认值。
如果我在这样的项目中省略了属性的“强”属性,
@property (nonatomic) NSString *string;
它给了我一个警告:
未指定“assign”、“retain”或“copy”属性 - 假定为“assign”
又名。
-Wobjc-property-no-attribute
所以不知何故,编译器似乎认为我仍在进行手动引用计数,否则不会有任何警告。
另外,当创建一个新的空项目时,当没有“强”属性时它不会警告我,所以它必须与当前项目设置有关,甚至可能是一些无法访问的标志通过用户界面。该项目是一个相当古老的项目(约 2 年),同时经历了几个迁移步骤(XCode 3 > 4 > 5、Non-ARC > ARC 等)。
我在项目设置中到处查看,但某处似乎缺少复选标记或其他东西。
有人遇到同样的问题吗?
【问题讨论】:
我没有遇到这个问题,但是在您的构建日志中应该有一个警告标识符-Wsomething
。也许这提供了一些线索。了解警告后,您可以使用 -Wno-something
编译器平面显式禁用它。
我不想禁用警告,我想知道编译器出了什么问题。 :)
我明白这一点(我不知道它来自哪里)。我的想法是警告的“名称”可能会给出一些提示。你在构建日志中找到了吗?
这是-Wobjc-property-no-attribute
你能显示导致警告的具体属性声明吗?
【参考方案1】:
刚刚搜索了一下,最近的构建属性是CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES
,我怀疑这有什么关系。
您可以通过在 Build Settings 视图中选择“All”和“Levels”选项来检查您的目标覆盖了哪些默认参数。
检查默认为“否”但目标正在变为“是”的警告。
【讨论】:
...但又一次:我不想关闭警告,我想修复我的项目文件。 如果您认为这是一个错误,您只需“修复”它。默认情况下,Xcode 认为省略strong
不是错误,如果您确实认为它是错误(通过启用该标志),那么您只需在缺少的地方添加 strong
即可修复它。否则,您清除标志并且没有什么可修复的,因为您不再认为它是一个错误。
我没有启用启用此警告的警告标志。您还注意到, -W objc-property-no-attribute 似乎无法通过 Xcode UI 进行调整。我也没有在任何其他与构建相关的脚本中摸索以启用此警告。 “grep -R objc-property-no-attribute *”在我的项目根目录中运行时不显示输出。【参考方案2】:
确保您拥有最新版本的 Xcode。这是一个新的编译器功能,它的工作方式在最近的更新中已经改变了好几次。
确保您的项目配置为使用 clang/llvm 而不是 gcc。我不记得 gcc 是否完全支持 ARC(有人可以评论他们知道吗?)但它绝对不支持所有功能。除非您更改它,否则旧的 Xcode 项目将使用 gcc。所有最近的语言更改仅在 clang/llvm 中实现
您是否启用了 ARC?这将改变行为,因为我们要注意 ARC 可以在项目范围内或针对特定文件启用或禁用。
Xcode 中的某些更改仅适用于新项目,而旧项目已配置为禁用它们。查看与 ARC 相关但未设置为默认值的任何设置。
【讨论】:
我确认在 Xcode 4.3 之前,@property 的默认值是弱/赋值(我不记得具体是哪个)。 Xcode 4.3 中的行为更改为与局部变量相同(默认情况下始终为 __strong) “Xcode 中的某些更改仅适用于新项目,而旧项目已配置为禁用它们。查看与 ARC 相关的任何未设置为默认值的设置。” @sdk 只是为了确定一下,您是否检查了Target -> Build Phases -> Compile Sources
以确认该文件没有-fno-objc-arc
?
杰普,我确实检查过了。以上是关于从属性中省略/删除“强”属性时发出警告?的主要内容,如果未能解决你的问题,请参考以下文章
部署时发出警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.j