现代的Objective-C惯例真的没有任何非属性的ivars吗?

时间:2012-10-10 14:36:37

标签: objective-c ios properties

  

可能重复:
  iOS: must every iVar really be property?

我刚刚读了一本书,说现代约定不是在大括号之间的.h文件中声明任何ivars,而是要创建所有属性。

我想确保即使在琐碎的情况下也是如此。我正在创建一个类,其中有一个名为“录音”的BOOL,表示该设备当前是否正在录制一些视频。这不是其他类需要的东西,我的倾向是将它作为BOOL放在标题中,然后在需要它的2个点中的.m文件中引用它。

但是,我也希望以正确的方式做事。但我不明白为什么我把它变成公共财产?

5 个答案:

答案 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编译它。