合成属性时命名实例变量的约定

时间:2011-11-27 06:00:10

标签: ios objective-c macos

在Objective-C中合成属性时,建议您不要简单地写:

@synthesize window; 

而是

@synthesize window = _window;

原因是你不希望你的实例变量与你的getter方法相同或“可能发生坏事”。

我总是在我的应用中使用@synthesize var1, var2, etc而不会发生“坏事”。会发生什么样的坏事?

2 个答案:

答案 0 :(得分:5)

过去常常发生不好的事情,特别是在人们将对象分配给存储iVar而不是属性的ARC之前。如果这是偶然的,那么合成的setter隐含的内存管理就不会被应用,导致泄漏或过早发布。

我用它来做这个简单的方法,但现在我使用前缀。我不再宣布我的iVar了,我让现代运行时为我照顾。我使用前缀,这样我就不会意外地使用像局部变量那样的iVar。

另外 - 我倾向于将我的属性称为self.iVar,几乎在我的课程中。这样我就可以在我想要的时候使用延迟加载的属性,而不必担心哪些属性并且不会延迟加载。

答案 1 :(得分:0)

在实例变量(如_myProperty)中使用前导下划线的最大原因是,当人们使用前导下划线读取代码时,他们知道您正在使用实例变量,而不是局部变量,全局变量或忘了写'#self;"喜欢self.myProperty,你故意这样做。

在ARC之前,_myProperty不会进行任何引用计数,而self.myProperty会(对于"保留" /"强"属性)。使用ARC时#34;复制"属性,_ myProperty确实引用计数但仍然没有复制,所以仍然存在一些差异。最重要的区别是_myProperty不会触发任何观察者。

相关问题