Effective OC: 6. 7. 8

6. 理解 属性 property 这一特性.

属性来封装对象中的数据,这些实例变量通过access方法来访问,即 getter和setter.  编译器会自动编写getter与setter, 开发者可以通过点语法 dot syntax来访问属性. 编译器将点语法转换为调用getter和setter,也就是点语法只是简单的语法糖而已.

使用@ dynamic关键字,在实现文件中,可以使编译器不自动创建gettersetter方法,且忽略编译时无法访问getter , setter的警告, 其访问方法可以在运行时,动态赋予.

属性 的attribute:

原子性: nonatomic  , 不设置nonatomic就是atomic原子的, 原子性极大访问降低效率.

读写权限: readwrite默认 ,readonly只读: 可以在声明中声称属性是只读,然后再class-continuation中重新定义为读写.

内存管理: 

assign: 对简单数据类型,即非对象的基础数据类型,进行赋值操作.

strong: 属性为拥有,即__strong

weak: 属性未非拥有,当对象被其他人释放时,该属性值为nil.

unsafe_unretained: 不安全的非持有状态,与assign的区别在于前者针对对象,而后者针对基础数据类型,与weak的区别在于其不安全,weak对象释放后为nil, 而这个不安全的属性值不会清空.

copy: 属性为持有状态,但是持有的不是设置的对象,而是该对象的copy, 这又涉及到copy与mutablecopy, 以及深浅赋值的内容. 设置该属性的目的是 创建赋值对象的不变版本,以保存这个可能会变化的值的当前属性值. 设置的对象必须实现NSObject的copy协议.

方法名: 属性可以指定方法名称,getter = ming , setter= ming , 以进行定制.


个人观点,对于一般私有不用于继承的属性,为了效率,都会直接访问属性本身,因为通过getter setter方法进行访问,本身效率就很低. 但是对于getter setter方法, 其对效率的提高还是有的. 但 对于创建消耗较大的对象, 使用getter 方法来实现延迟创建, 只有用到的时候才创建该对象, 而表示固定在初始化时创建, 这样对效率的提高还是很大的.


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

这里继续对属性进行讨论, 方法派发 method dispatch是很耗时的,与一般语言比起来,效率低太多,其他语言直接根据函数地址访问函数,而OC中,要发送消息,然后消息响应对象中寻找消息函数,然后调用.

所以,一般的做法都是,在类中直接访问实例变量, 而着重注意这些属性的初始化,以防直接访问未初始化的实例变量. 一般选择在构造函数中进行初始化,但是 如果调用setter方法进行初始化,调用的可能是子类派生的写法,所以也还是应该直接访问实例变量进行赋值.


所以说,对象内部尽量使用 直接访问, 而通过访问方法getter能够带来的速度提升,体现在 惰性初始化,延迟创建上, 对于耗费较大的对象,可以忽略调用的消耗,而强调延迟创建带来的效率提升. 


8. 理解equality 这一概念.

同其他语言一样, 直接对 实例对象进行== 判断,判断的是对象指针是否相等,即地址是否相同. 要实现真正的对象是否相同的判断, 要实现和使用NSObject 协议中的 

- (BOOL) isEqual: (id) object;

-(NSUInteger) hash;

如果两个对象使用isEqual 判断相等, 那么 hash必须返回相同的值 . 但是反之不是如此,即hash值相同但是两者并不一定isEqual .

而在isEqual中对两者是否相同的判断,一般先判断两者地址是否相同,地址相同一般是相同的,然后判断对象 的 类 是否相同, 但是基类和派生类的类是不相同的, 但是两者有可能是相同的, 所以要注意这一点,进行考虑.

hash 使用在collection中, 作为hash值,来进行索引. 设计一个相对合理 碰撞较少 且速度较快的 哈希算法. 

而在这里还需要注意的一点是, 在容器中加入可变对象后, 会引发一些不好的效果. 首先,collection在加入对象时,记录其hash值,而不再进行维护. 对collection里面的可变对象进行修改, 如果拿这个collection与其他collection进行比较,比较的是修改前的hash. 而如果在set中,对可变对象进行修改可以导致set中含有多个相同的对象.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值