Gen*_*ted 27 getter setter objective-c
我是初学者.我刚刚开始学习iOS过去两个月,我没有任何编程背景.(虽然有点Java).任何人都可以在Objective C中解释什么是getter和setter?它们有什么用?我们为什么要使用@property和@synthesize?
zrs*_*slv 80
Getter是一种在每次访问(读取值)属性(声明为@property)时调用的方法.无论该方法返回什么,都被视为属性的值:
@property int someNumber;
Run Code Online (Sandbox Code Playgroud)
...
- (int)someNumber {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
...
NSLog("value = %d", anObject.someNumber); // prints "value = 42"
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
...
anObject.someNumber = 19; // prints "someValue has been assigned a new value: 19"
Run Code Online (Sandbox Code Playgroud)
通常,从getter返回相同的值并在setter中打印新值没有多大意义.要实际存储您必须在类中声明实例变量(ivar)的内容:
@interface SomeClass : NSObject {
int _someNumber;
}
Run Code Online (Sandbox Code Playgroud)
并使访问器(getter和setter的集合名称)存储/检索它的值:
- (int)someNumber {
return _someNumber;
}
- (void)setSomeNumber:(int)newValue {
_someNumber = newValue;
}
Run Code Online (Sandbox Code Playgroud)
...
SomeClass *anObject = [[SomeClass alloc]init];
anObject.someNumber = 15;
NSLog(@"It's %d", anObject.someNumber); // prints "It's 15"
Run Code Online (Sandbox Code Playgroud)
好的,现在该属性的行为与通常的变量一样.编写所有代码的重点是什么?
首先,从现在开始,您可以向访问者添加一些额外的代码,每次访问或更改属性时都会执行这些代码.这样做有很多原因,例如我可能想要做某种隐藏的计算,或者更新我的对象的状态,缓存等等.
其次,Cocoa中存在称为键值编码(KVC)和键值观察(KVO)的酷机制.它们取决于属性.您可以在开发人员库中阅读它们:KVC编程指南和KVO编程指南.这些都是高级主题.
最后,在Objective 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.
Run Code Online (Sandbox Code Playgroud)
这一行为您生成int _someNumber变量,someNumbergetter和setSomeNumbersetter.如果您希望访问器执行比仅从某个实例变量中存储/检索值更复杂的任何操作,则必须自己编写它们.
希望这一切都有意义.
小智 5
"Getters"和"setter"用于控制对变量(字段)的更改.
"setter"最常用于面向对象的编程,与封装原理保持一致.根据这个原则,类的成员变量是私有的,以隐藏和保护它们免受其他代码的攻击,并且只能通过公共成员函数进行修改,该函数将所需的新值作为参数,可选地对其进行验证,并修改私有成员变量.
通常,"setter"伴随着"getter"(也称为访问器),它返回私有成员变量的值.
Getter/Setter方法也可用于非面向对象的环境中.在这种情况下,对要修改的变量的引用将与新值一起传递给方法.在这种情况下,编译器不能限制代码绕过getter/setter方法并直接更改变量.开发人员有责任确保变量仅通过这些方法进行修改,而不是直接修改.
在支持它们的编程语言中,属性提供了一种方便的替代方案,而不会放弃封装的实用性.
| 归档时间: |
|
| 查看次数: |
66555 次 |
| 最近记录: |