Effective Objective-C 2.0读书笔记(五)

第25条,总是为第三方类的分类名称加前缀

  • 向第三方类中添加分类时,总应给其名称加上你的专用的前缀。
  • 向第三方类中添加分类时,总应给其中的方法名加上你专用的前缀。

关键词:第三方类、分类前缀

 

第26条,勿在分类汇总声明属性

  • 分类中只能覆写主类的方法和新增方法,但是不能新增属性(实在要加,从技术上可行,但是需要自己先@dynamic 声明属性,再关联对象写set/get方法,容易导致内存管理出错)。
  • 把封装数据所用的全部属性都定义在主接口里。
  • 在“class-continuation分类”之外的其他分类中,可以定义存取方法,但尽量不要定义属性。

关键词:分类、属性

 

第27条,使用“class-continuation 分类”隐藏实现细节

  • 通过“class-continuation 分类”向类中新增实例变量。
  • 如果某属性在主接口中声明为“只读”,而类的内部又要用设置方法修改此属性,那么就在“class-continuation 分类”中将其扩展为“可读写”。
  • 把私有方法的原型声明在“class-continuation 分类”里面。
  • 若想使类所遵循的协议不为所知,则可于“class-continuation 分类”中声明。
  • 关键词:class-continuation、实例变量、属性

 

第28条,通过协议提供匿名对象

  • 匿名对象:delegate、字典(NSDictionary)的key、键值对的key、数据库连接。
  • 协议可在某种程度上提供匿名类型。具体的对象类型可以淡化称遵从某协议的 id 类型,协议里规定了对象所应实现的方法。
  • 使用匿名对象来隐藏类型名称(或类名)。
  • 如果具体类型不重要,重要的是对象能够响应(定义在协议里的)特定方法,那么可使用匿名对象来表示。

关键词:匿名对象、键值对

 

第29条,理解引用计数(重点)

  • 引用计数概念:OC里的每个对象都有一个可以递增或递减的计数器,如果想某个对象继续存活,就递增其引用计数,用完了之后,就递减计数,如果计数为0,表示没人关注这个对象,这个时候,可以把它销毁。
  • NSObject协议声明了三个方法用来操作计数器,用来递增或者递减其值:retain(递增保留计数)、release(递减保留计数)、autorelease(代稍后处理“自动释放池”时,再递减保留计数)。
  • 引用计数的工作原理:a.对象创建出来的时候,其保留计数为1;b.如果想要其继续存活就调用retain方法;c.如果不想其存活就调用release或者autorelease方法;d.当对象的保留计数为0时候,这个对象就被回收了(deallocated),这时候系统会将其占用的内存标记为“可重用”(reuse)。
  • 调用者通过alloc方法,表达了其令该对象继续存活下去的意愿。
  • 在alloc或者“initWithInt:”方法的实现代码中,也许还有其他对象也保留了此对象,所以保留计数不一定是1。
  • 为了避免不经意间使用了无效对象,一般在调用完release之后都会清空指针,保证了不会出现可能指向无效对象的指针。
  • 在属性存取方法中的内存管理:属性为“strong”拥有关系时,set值的时候,会保留新值并释放旧值,然后更新实例变量,令其指向新值。
  • 自动释放池(autorelease):又称稍后递减计数,通常在下一次事件循环的时候递减,也可能更早。
  • 自动释放池的稍后释放对象,会延长对象的生命周期,使其在跨越方法调用边界后依然可以存活一段时间。
  • 保留环:至少两个对象形成保留环(有点类似进程的死锁),两个对象如果相互引用就会形成保留环,解决办法就是采用弱引用(weak reference)。
  • 引用计数机制可以递增递减的计数器来管理内存。对象创建好之后,其保留计数至少为1。若保留计数为正,则对象继续存活。当保留计数降为0时,对象就被销毁了。
  • 在对象生命期中,其余对象通过引用来保留或释放此对象。保留与释放操作分别会递增及递减保留计数。

关键词:内存管理、引用计数、自动释放池、保留环、弱引用

 

 

第30条,以 ARC 简化引用计数(重点)

  • Clang编译器项目带有一个“静态分析器”(static analyzer),用于指明程序引用计数出问题的地方。
  • ARC(Automatic Reference Counting):自动引用计数,就是会自动执行retain、release、autorelease等操作,ARC在调用retain、release、autoreleasse这些方法的时候,不会走消息派发机制,而是直接调用底层C语言的等价方法objc_retain等。
  • ARC下不能手动去调用:retain、release、autorelease、dealloc,直接调用会编译报错。
  • ARC的很多功能都是基于核心的内存管理语义构建的。
  • ARC下特定方法名以:alloc、new、copy、mutableCopy开头其返回的对象归调用者所有,即需要自己负责释放方法所返回的对象,这些方法内部创建的对象自从alloc 计数加1后,不会再执行retain、release 或者 autorelease。
  • 编译期,ARC会把能够相互抵消的retain、release、autorelease操作约简,即发现多次“保留”与“释放”操作会成对的移除这两个操作。
  • ARC为了向后兼容没有舍弃autorelease。
  • 在变量的内存管理语义中,ARC会用一种安全的方式来保护set方法中保留计数不会降为0:先保留新值,再释放旧值,最后设置实例变量。
  • __strong:默认语义,保留其值;__unsafe_unretained:不保留此值,这么做可能不安全,等到再次使用变量的时候,其对象有可能已经回收;__weak:不保留其值,但是变量可以安全使用,因为如果系统把这个对象回收了,那么变量也会清空。__autoreleasing:把对象“按引用传递”给方法时,使用这个特色的修饰符,此值在方法返回时自动释放。
  • ARC下不能直接调用dealloc,但是会自动在.cxx_destruct方法中生存代码运行此方法,在生成的代码中自动调用超类的dealloc方法。
  • ARC下,不能覆写内存管理方法。 

关键词:静态分析器、ARC自动计数管理、retain、release、autorelease、dealloc

posted @ 2020-07-08 16:29  仲长可倾  阅读(109)  评论(0编辑  收藏  举报