我目前正在学习Objective-C中的内存管理和属性。我最近通读了这篇文章,并回答了我之前关于@property
和@synthesize
如何在Objective-C中工作的问题。这在一定程度上澄清了事情。
重点似乎是在内存管理方面区分局部变量和成员变量,但我仍然不完全清楚这个主题。
如果我有:
@interface FooClass : NSObject {
NSObject *bar_;
}
为什么我需要创建属性?我的意思是,我知道属性会创建getter和setter,但那又怎样呢?我有我的实例变量bar_
,我可以使用foo.bar_ = newObject;
设置它。拥有一个名为bar
的属性,然后使用foo.bar = newObject
设置bar_
,这给我带来了什么好处?
首先,对于访问实例变量,不能使用
foo.bar_ = newObject;
你需要使用
foo->bar_ = newObject;
(当然,bar_i-var必须声明为公共变量,如果您不想得到编译器错误的话)
如果像上面这样分配对象,您将被迫在每次分配时添加与内存管理相关的代码(在非ARC项目中),这将导致代码复杂性增加。
使用属性的另一个原因是,重写setter或getter将允许您在赋值或解析值时执行自定义操作。
但是,如果你不熟悉OOP原理,这里的主要原因是抽象。你的类用户一定不知道你的类是如何在内部实现的,否则你的代码中会有太多的硬依赖项。分离、更新或支持某些内容将非常困难。
在不创建setter的情况下,不能使用foo.bar_
设置bar_
,因为在Objective-C中,点语法实际上调用setter方法。
此外,通常bar_
是私有的,所以您不能直接从类外访问它。
创建属性将自动创建getter/setter方法;此外,它还将处理内存问题(根据创建属性时指定的参数,如retain、copy、assign等)。
Getters/ssetters封装ivar并负责内存管理、并发访问(非原子..)等。像KVO这样的东西依赖于getter/Setters这样的约定。