Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Xcode 5中禁用属性的属性自动合成?_Ios_Objective C_Xcode_Macos_Llvm - Fatal编程技术网

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

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行。不会有任何警告,但当然不会为该属性调用我的代码 我想

我编写了一个库,根据您在“preferences”类中声明的
@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