4

可能重复:
iOS:每个 iVar 都必须真的是财产吗?

我刚读过一本书,它说现代惯例根本不在你的 .h 文件中的花括号之间声明任何 ivars,而是让所有东西都成为属性。

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

但是,我也想以公认的、正确的方式做事。但我不明白为什么我把它设为公共财产?

4

5 回答 5

8

你读的是错误的,简单明了。

现代惯例是当存在可以合成它们的相应属性时跳过 ivars。此外,使用最新版本的 LLVM,可以将您的 ivars 移动到您的实现文件(正如@DrummerB 已经提到的),以便标头不包含 ivars。这被认为是一种很好的做法,因为它不会暴露类的内部工作。

但是根本就没有 ivars 并且对所有曾经是 ivar 的东西都有一个属性吗?不,不是普通的 Objective-C。

于 2012-10-10T14:40:44.677 回答
5

你的书是对的(也是错的)。不要再在标题中声明 ivars。仅出于兼容性原因才支持此功能。但也不要为私有变量声明属性。

如果您想声明其他类不需要使用的私有 ivar,请在您的实现文件中声明它们:

// MyClass.m
@implementation {
    BOOL recording;
}

// methods

@end
于 2012-10-10T14:38:35.690 回答
2

我建议根本不要使用 ivar。相反,您可以创建一个类扩展,您将在其中声明必须隐藏的属性:

@interface MyClass ()

@property (nonatomic, assign) BOOL recording;

@end
于 2012-10-10T14:41:35.517 回答
1

你可以使用类似的东西

@interface G4AppDelegate ()

@property (nonatomic, assign) BOOL recording;

@end

制作“内部”属性。

或者作为其他答案状态,在您的实施中使用 iVar

于 2012-10-10T14:40:57.453 回答
0

有些书解释说你应该只使用 getter 和 setter 来访问你的 ivar,即使它们是私有的。这对我来说有点太精神病了。

在 clang 之前,您应该必须在类上创建类别并使用合成器将您的 ivar 设为私有。像这样:

@interface AppDelegate ()
@property(nonatomic, assign)int aValue;
@end

// + @implement AppDelegate // @synthetise aValue;

这可能很烦人,因为有时你需要一些简单的 ivar,没有任何 getter/setter 控制。而且你在不需要的地方添加代码。

现在使用 clang,您可以将您的 ivar 直接放在您的代码中的实现文件中,如下所示:

@interface AppDelegate (){
  int _aValue;
}
@end

而且您将私有 ivar 隐藏在标头范围之外。注意,你不能用 gcc 编译它。

于 2012-10-10T14:53:00.923 回答