编写高质量iOS与OS X代码的52个有效方法(二)

2019-07-05  本文已影响0人  辣椒切成丝

编写高质量iOS与OS X代码的52个有效方法(一)

对象、消息、运行期

6、理解“属性”这一概念

“属性”是OC的一项特性,用于封装对象中的数据。OC对象通常会把其所需要的数据保存为各种实例对象。实例对象一般通过“存取方法”来访问。其中,“获取方法(getter)”用于读取变量值,而“设置方法(setter)”用于写入变量值。

属性特质

@property (nonatomic, readwrite, copy) NSString *firstName;

属性可以拥有的特质分为四类:

原子性

在默认情况下,由比编译器合成的方法会通过锁定机制确保其原子性。如果属性具备nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备nonatomic特质,那他就是“原子的”(atomic)),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么久应该遵从与属性特质享福的原子性。

读/写权限

内存管理语义

属性用于封装数据,而数据则要有“具体的所有权语义”。

方法名
@peroperty (nonatomic, getter=isOn) BOOL on;

要点

7、在对象内部尽量直接访问实例变量

@interface Eoperson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
- (NSString*)fullName;
- (void)setFullName:(NSString*)fullName;
@end
//fullName与setFullName这两个方法可以这样实现
- (NSString*)fullName {
  return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
- (void)setFullName:(NSString*)fullName {
  NSSArray *components = [fullName componnentsSeparatedByString:@" "];
  self.firstName = [components objectAtIndex: 0];
  self.lastName = [components objectAtIndex: 1];
}

在fullName的获取方法与设置方法中,我们使用"点语法",通过存取方法来访问相关的实例变量。现在假设重写这两个方法,不经由存取方法,而是直接访问实例变量

- (NSString*)fullName {
  return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}
- (void)setFullName:(NSString*)fullName {
  NSSArray *components = [fullName componnentsSeparatedByString:@" "];
  _firstName = [components objectAtIndex: 0];
  _lastName = [components objectAtIndex: 1];
}
这两种方法的区别
要点

8、理解“对象等同性”这一概念

特定类所具有等同性判定方法

例如:“isEqualToArray:”“isEqualToDictionary”

等同性判定的执行深度

创建等同性判定方法时,需要决定是根据整个对象来判断等同性,换是根据其中几个字段来判断。NSA仍然有的检测方式为先看两个数组包含的对象个数是否相同,若相同,则在两个对应位置的两个对象身上调用“isEqual:”方法。如果对象位置身上均相等,那么这两个数组就想等,这就叫做“深度等同性判定”。不过有时候无须降所有数据逐个比较,只根据其中部分数据即可判定二者是否相同。
假如,一个Persion类是根据数据库里的数据创建出来的,那么其中就可能会含有另外一个属性,此属性是“唯一标识符”,那么我们只需要检测两个对象中的标识符是否相同就能判定两个对象是否相等。

容器中可变类的等同性

容器中放入可变对象的时候,就不应在改变其哈希码了。

要点
上一篇 下一篇

猜你喜欢

热点阅读