Ios 如何在Xcode 5中禁用属性的属性自动合成?
我编写了一个库,根据您在“preferences”类中声明的Ios 如何在Xcode 5中禁用属性的属性自动合成?,ios,objective-c,xcode,macos,llvm,Ios,Objective C,Xcode,Macos,Llvm,我编写了一个库,根据您在“preferences”类中声明的@dynamic属性自动生成NSUserDefaults访问器(请参阅)。将属性写入.m文件,如下所示: @property (nonatomic, assign) BOOL hasSeenIntro; 然后将其添加到.h文件: @dynamic hasSeenIntro; 这很好,但是如果用户不小心忘记输入@dynamic行,那么编译器将自动生成一个等效的@synthesis行。不会有任何警告,但当然不会为该属性调用我的代码 我想
@dynamic
属性自动生成NSUserDefaults访问器(请参阅)。将属性写入.m文件,如下所示:
@property (nonatomic, assign) BOOL hasSeenIntro;
然后将其添加到.h文件:
@dynamic hasSeenIntro;
这很好,但是如果用户不小心忘记输入@dynamic
行,那么编译器将自动生成一个等效的@synthesis
行。不会有任何警告,但当然不会为该属性调用我的代码
我想知道是否有一种方法可以禁用这个类的自动属性合成
更新:
感谢Nikolai的回答,我记得可以将LLVM警告升级为错误,并用该错误包装声明以达到我想要的效果(如果用户忘记指定@dynamic
行,则会引发错误):
好吧,没有办法做到这一点,因为在以前的Xcode版本中,没有办法标记您是否忘记@synthesis一个特定属性。只有在运行时,才会引发无法识别的选择器错误。无法通过代码实现这一点 有一个编译器警告(通过Xcode的构建设置“隐式合成属性”(Implicit syntheticed Properties)、
CLANG\u WARN\u OBJC\u MISSING\u PROPERTY\u synthetic
)进行控制),但您必须在实现文件中手动设置,因此对于您的情况来说,这并没有真正的帮助
这里还有另一个想法:更改实现,使用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类将该警告升级为错误。
> warning: property 'foo' requires method 'foo' to be defined - use @dynamic or provide a method implementation in this category