请解释目标C中的getter和seters



可能的重复项:
Setters and Getters (菜鸟( - iPhone SDK

我是这里的初学者。在过去的两个月里,我刚刚开始学习iOS,没有任何编程背景。(虽然有点爪哇(。谁能解释一下目标 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 编程指南和 KVO 编程指南。不过,这些都是高级主题。

最后,在目标 C 中,没有对象的静态分配。所有对象都是动态分配的(原因(。如果要将对象指针保留在实例变量(而不是属性(中,则必须在每次为ivar分配新值时手动执行所有内存管理(当自动引用计数打开时不为真(。使用属性,您可以在访问器中放置一些内存管理代码,从而使您的生活更轻松。

我不相信这个解释对于不熟悉 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吸尘器和setSomeNumber二传手。如果您希望访问器执行任何比仅从某个实例变量中存储/检索值更复杂的操作,则必须自己编写它们。

希望这一切都有意义。

">

Getters"和"setters"用于控制对变量(字段(的更改。

"setter"最常用于面向对象编程,以符合封装原则。根据这一原则,类的成员变量被设为私有,以隐藏和保护它们免受其他代码的影响,并且只能由公共成员函数修改,该函数将所需的新值作为参数,选择性地对其进行验证,并修改私有成员变量。

通常,"setter"伴随着一个"getter"(也称为访问器(,它返回私有成员变量的值。

Getter/Setter 方法也可以用于非面向对象环境。在这种情况下,对要修改的变量的引用与新值一起传递给方法。在这种情况下,编译器无法限制代码绕过 getter/setter 方法并直接更改变量。开发人员有责任确保仅通过这些方法修改变量,而不是直接修改变量。

在支持它们的编程语言中,属性提供了一种方便的替代方案,而不会放弃封装的效用。

在大多数面向对象的语言中,属性"getters"和"setters"都围绕类实例的私有成员提供"外部"或用户界面。一些 OO 批评者将它们称为"语法糖",但归根结底是,类的使用者将使用以编程方式控制的这些接口,而不是访问实际的私有成员本身。这样,您可以(例如(保护私有变量不接收无效或超出范围的值,或者通过仅提供 getter 而不提供 setter 使属性成为只读。更有趣的是,getter 和 setter 可能会包装未在类中本机保留的属性,但可能(例如(基于其他实例成员进行计算。

Getter 和 setter 肯定不是 Objective-C 独有的;如果你继续用其他 OO 语言编程,你会发现它们在 C#、Java 和其他语言中

都有。

祝你好运。

最新更新