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

Coc*_*ico 4 properties objective-c ios

可能重复:
iOS:每个iVar必须真正属性吗?

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

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

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

Jon*_*pan 8

你读的是错的,简单明了的.

现代约定是当有相应的属性可以合成它们时跳过ivars.此外,使用最新版本的LLVM,可以将您的ivars移动到您的实现文件(如@DrummerB已经提到的那样),以便标头不包含ivars.这被认为是良好的做法,因为它不暴露班级的内部运作.

但是根本没有ivars和伊萨的一切财产?不,不是正常的Objective-C.

  • 现代公约正在发生变化; 我参与的越来越多的项目使用`@ property`来声明所有内容,包括只能通过`_ivar`访问的内容,因为`@ property`使用附加属性捕获更多意图.并不是说这个答案是错误的,只是随着语言的发展,这种惯例会不断发展. (2认同)

Dru*_*erB 5

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

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

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

// methods

@end
Run Code Online (Sandbox Code Playgroud)