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

时间:2012-03-09 11:50:57

标签: objective-c memory-management properties

我目前正在学习Objective-C中的内存管理和属性。我最近阅读了this postanswers to my previous question,了解了@property@synthesize在Objective-C中的工作方式。这有点澄清了一些事情。

似乎关键在于在内存管理方面区分局部变量和成员变量,但我仍然不完全清楚这个主题。

如果我有:

@interface FooClass : NSObject {
     NSObject *bar_;    
}

为什么我需要创建属性?我的意思是,我明白这个属性创造了吸气剂和制定者,但那又怎么样?我有我的实例变量bar_,我可以使用foo.bar_ = newObject;设置它。它有什么优势让我拥有一个名为bar的属性,然后使用bar_设置foo.bar = newObject

3 个答案:

答案 0 :(得分:1)

首先,要访问实例变量,您无法使用

foo.bar_ = newObject;

你需要使用

foo->bar_ = newObject;

(当然,如果你不想得到编译器错误,必须将bar_ i-var声明为public;)

如果分配上述对象,您将被迫在每次分配时添加与内存管理相关的代码(在非ARC项目中) - 这将导致代码复杂性增加。

使用属性,覆盖setter或getter的另一个原因是允许您在赋值或解析值时执行自定义操作。

但这里的主要原因是,如果你不熟悉OOP原则 - 抽象。您的类用户必须不知道,您的类在内部是如何实现的,或者您的代码中会有太多的硬依赖项。分离,更新或支持某些内容将非常困难。

答案 1 :(得分:0)

在不创建setter的情况下,无法使用bar_设置foo.bar_,因为在Objective-C中,dot-syntax实际上调用了setter方法。

此外,通常bar_它是私人的,因此您无法直接从课外访问它。

创建属性将自动创建getter / setter方法;此外,它还会考虑内存问题(根据您在创建属性时指定的参数,如保留,复制,分配等)。

答案 2 :(得分:0)

Getters / Setters封装了ivars并负责内存管理,并发访问(非原子等)等。像KVO这样的东西依赖于getter / setter之类的约定。