我刚刚读了一本书,说现代约定不是在大括号之间的.h文件中声明任何ivars,而是要创建所有属性。
我想确保即使在琐碎的情况下也是如此。我正在创建一个类,其中有一个名为“录音”的BOOL,表示该设备当前是否正在录制一些视频。这不是其他类需要的东西,我的倾向是将它作为BOOL放在标题中,然后在需要它的2个点中的.m文件中引用它。
但是,我也希望以正确的方式做事。但我不明白为什么我把它变成公共财产?
答案 0 :(得分:8)
你读的是错的,简单明了。
现代约定是当有一个可以合成它们的相应属性时跳过ivars。此外,使用最新版本的LLVM,可以将您的ivars移动到您的实现文件(如@DrummerB已经提到的那样),以便标头不包含ivars。这被认为是良好的做法,因为它不暴露班级的内部运作。
但是根本没有ivars和伊萨的一切财产?不,不是正常的Objective-C。
答案 1 :(得分:5)
你的书是对的(也是错的)。不要再在标题中声明ivars了。仅出于兼容性原因支持。但也不要声明私有变量的属性。
如果您想要声明其他类不需要使用的私有ivar,请在您的实现文件中声明它们:
// MyClass.m
@implementation {
BOOL recording;
}
// methods
@end
答案 2 :(得分:2)
我建议不要使用ivar。相反,您可以创建一个类扩展,在其中声明必须隐藏的属性:
@interface MyClass ()
@property (nonatomic, assign) BOOL recording;
@end
答案 3 :(得分:1)
您可以使用类似
的内容@interface G4AppDelegate ()
@property (nonatomic, assign) BOOL recording;
@end
制作“内部”财产。
或者其他答案状态在您的实现中使用iVar
答案 4 :(得分:0)
有些书籍解释说,你应该只使用getter和setter来访问你的ivar,即使它们是私有的。这对我来说有点太精神病了。
在clang之前,你应该在课堂上创建类别并使用合成器来使你的ivar私密。像这样:
@interface AppDelegate ()
@property(nonatomic, assign)int aValue;
@end
// + @implement AppDelegate // @synthetise aValue;
这可能很烦人,因为有时你需要一些简单的ivar,没有任何getter / setter控件。你在没有必要的地方添加代码。
现在有了clang,你可以将ur ivar直接放在你的代码中的实现文件中:
@interface AppDelegate (){
int _aValue;
}
@end
你将私人ivar隐藏在标题范围之外。 注意,你不能用gcc编译它。