在Objective-C中合成属性时,建议您不要简单地写:
@synthesize window;
而是
@synthesize window = _window;
原因是你不希望你的实例变量与你的getter方法相同或“可能发生坏事”。
我总是在我的应用中使用@synthesize var1, var2, etc
而不会发生“坏事”。会发生什么样的坏事?
答案 0 :(得分:5)
过去常常发生不好的事情,特别是在人们将对象分配给存储iVar而不是属性的ARC之前。如果这是偶然的,那么合成的setter隐含的内存管理就不会被应用,导致泄漏或过早发布。
我用它来做这个简单的方法,但现在我使用前缀。我不再宣布我的iVar了,我让现代运行时为我照顾。我使用前缀,这样我就不会意外地使用像局部变量那样的iVar。
另外 - 我倾向于将我的属性称为self.iVar
,几乎在我的课程中。这样我就可以在我想要的时候使用延迟加载的属性,而不必担心哪些属性并且不会延迟加载。
答案 1 :(得分:0)
在实例变量(如_myProperty)中使用前导下划线的最大原因是,当人们使用前导下划线读取代码时,他们知道您正在使用实例变量,而不是局部变量,全局变量或忘了写'#self;"喜欢self.myProperty,你故意这样做。
在ARC之前,_myProperty不会进行任何引用计数,而self.myProperty会(对于"保留" /"强"属性)。使用ARC时#34;复制"属性,_ myProperty确实引用计数但仍然没有复制,所以仍然存在一些差异。最重要的区别是_myProperty不会触发任何观察者。