Objective-C中的局部变量与成员变量



我目前正在学习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这样的约定。

最新更新