如何在Xcode 5中禁用属性自动合成?

4

我编写了一个库,可以根据你在“preferences”类中声明的 @dynamic 属性自动生成 NSUserDefaults 访问器(详见PAPreferences)。你可以在 .m 文件中像这样编写属性:

@property (nonatomic, assign) BOOL hasSeenIntro;

然后将以下内容添加到.h文件:

@dynamic hasSeenIntro;

这个方法很好用,但是如果用户不小心忘了加上 @dynamic 这一行,编译器就会自动生成一个相应的 @synthesize 行。虽然不会有任何警告,但我的代码当然也无法为该属性调用。

我想知道是否有办法仅禁用此类别的自动属性合成。

更新:

感谢 Nikolai 的答案,我记得可以将 LLVM 警告升级为错误,并将声明封装在该错误中以实现我想要的效果(如果用户忘记指定 @dynamic 行,则会引发一个错误):

// Ensure we get an error if we forget to add @dynamic for each property
#pragma clang diagnostic push
#pragma clang diagnostic error "-Wobjc-missing-property-synthesis"

@interface Preferences : PAPreferences

@property (nonatomic, assign) BOOL hasSeenIntro;
@property (nonatomic, assign) NSInteger pressCount;

@end

#pragma clang diagnostic pop
2个回答

7

无法通过代码实现此操作。

有一个编译器警告(通过Xcode的构建设置“隐式合成属性”控制,CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS),但您必须手动在实现文件上设置,所以对于您的情况并不真正有帮助。

这里有另一个想法:将属性添加到 PAPreferences 的类别中而不是子类中。然后,编译器无法合成访问器,并且如果缺少 @dynamic,则会发出警告。

@interface PAPreferences (SynthesizedProperties)
@property int foo;
@end

@implementation PAPreferences (SynthesizedProperties)
@end

结果:

> warning: property 'foo' requires method 'foo' to be defined - use @dynamic or provide a method implementation in this category

此外(或者也可以),您可以在运行时检查属性,以便检测意外合成的访问器,并在这种情况下发出警告。


谢谢提供这些选项 - 我不想选择分类路线,因为用户代码会变得更难理解。然而,我忘记了属性综合编译器警告。最终我采取的结果是将该警告在 preferences 类中升级为错误。 - Denis Hennessy

0
据我所知,目前还没有办法做到这一点。在之前的Xcode版本中也没有标记是否忘记了为特定属性添加 @synthesize 的方法。只有在运行时才会出现未识别选择器错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接