objective-c - 请解释 Objective C 中的 Getter 和 Setter

标签 objective-c setter getter

<分区>

Possible Duplicate:
Setters and Getters (Noobie) - iPhone SDK

我是这里的初学者。我最近两个月才开始学习 iOS,我没有任何编程背景。 (虽然有一点点 Java)。谁能解释一下 Objective C 中的 getter 和 setter 是什么?它们有什么用?为什么我们使用 @property@synthesize

最佳答案

Getter 是一种在您每次访问(从中读取值)属性(使用 @property 声明)时调用的方法。该方法返回的任何内容都被视为该属性的值:

@property int someNumber;

...

- (int)someNumber {
    return 42;
}

...

NSLog("value = %d", anObject.someNumber); // prints "value = 42"

Setter 是每次更改属性值时都会调用的方法。

- (void)setSomeNumber: (int)newValue { // By naming convention, setter for `someValue` should 
                                    // be called `setSomeValue`. This is important!
    NSLog("someValue has been assigned a new value: %d", newValue);
}

...

anObject.someNumber = 19; // prints "someValue has been assigned a new value: 19"

通常只从 getter 返回相同的值并在 setter 中打印新值没有多大意义。要实际存储一些东西,您必须在您的类中声明一个实例变量 (ivar):

@interface SomeClass : NSObject {
    int _someNumber;
}

并创建访问器(getter 和 setter 的统称)来存储/检索它的值:

- (int)someNumber {
    return _someNumber;
}

- (void)setSomeNumber:(int)newValue {
    _someNumber = newValue;
}

...

SomeClass *anObject = [[SomeClass alloc]init];
anObject.someNumber = 15;
NSLog(@"It's %d", anObject.someNumber); // prints "It's 15"

好的,现在该属性的行为就像通常的变量一样。编写所有这些代码有什么意义?

首先,从现在开始,您可以向访问器添加一些额外的代码,每次访问或更改属性时都会执行这些代码。这样做有多种原因,例如我可能想进行某种隐藏计算,或者更新对象的状态、缓存内容等。

其次,Cocoa 中有称为键值编码 (KVC) 和键值观察 (KVO) 的很酷的机制。它们取决于属性。您可以在开发人员库中阅读有关它们的信息:KVC Programming GuideKVO Programming Guide .不过,这些都是高级主题。

最后,在 Objective C 中没有对象的静态分配。所有对象都是动态分配的(reason)。如果你想将你的对象指针保存在实例变量中(而不是属性),你将不得不在每次为你的 ivar 分配新值时手动进行所有内存管理(当 Automatic Reference Counting 开启时不正确)。使用属性,您可以在访问器中放置一些内存管理代码,让您的生活更轻松。

我认为这个解释对于不熟悉 Objective C 内存管理的人来说没有多大意义,所以,要么阅读一些真正的文档/教程,要么只使用属性(而不是实例变量)直到你以一种或另一种方式了解所有细节。就个人而言,我不喜欢第二种选择,但这取决于您。

您可以使用@synthesize 让编译器自动为您生成基本访问器和底层实例变量。除了上面的代码(-(int)someNumber-(void)setSomeNumber:)你可以写

@synthesize someNumber = _someNumber; // = _someNumbers tells compiler 
                                      // to name the instance variable `_someNumber`. 
                                      // You could replace it with = `_somethingElse`, of
                                      // course, but that's an ill idea.

这一行为您生成int _someNumber 变量、someNumber getter 和setSomeNumber setter。如果您希望访问器执行比仅从某个实例变量存储/检索值更复杂的操作,则您必须自己编写它们。

希望这一切有意义。

关于objective-c - 请解释 Objective C 中的 Getter 和 Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10425827/

相关文章:

objective-c - nspredicate 转义 url

java - 如何在GUI中对私有(private)变量应用Getter/Setter方法?

java - 如何累积一个调用 setter 方法并以其中的变量作为参数?

Pythonic 替代 dict-style setter?

c++ - 安全地直接访问类(class)成员

java - Java 中的获取和设置(这里是新手程序员)

objective-c - objective-c 中的双向字典

ios - JSON字典为NSNumber返回__NSCFNumber类

iOS:一段时间后保存托管对象上下文需要超过 1 秒

java - 基本的 spring 依赖注入(inject)问题,没有 setter 只有 getter