OC-内存管理

136 阅读2分钟

#大家都知道目前苹果的内存管理机制是采用的是ARC管理机制,很大程度上减少了开发者的工作量.

##首先内存管理的思考方式 1.自己生成的对象,自己所持有 2.非自己生成的对象,自己也能持有 3.不在需要自己持有的对象时释放 4.非自己持有的对象无法释放

##对象操作与OC对应的方法

对象操作 OC方法
生成并持有对象 alloc/copy/mutableCopy
持有对象 retain
释放对象 release
废弃对象 dealloc

#以上这些是怎么实现的呢? 很遗憾NSObject类的Foundation 框架并没有公开 我们可以看看开源的GNUstep框架.来看看他们的实现. GNUstep框架是Cocoai框架互换的框架,也就是说GNUstep的原码虽不能与苹果的Cocoa实现完全相同,但是熊使用者的角度来看,两者行为和实现方式是一样的.或者说是非常相似.理解GNUstep源代码也就相当于理解了苹果的Cocoa实现.

#GNUstep 1.在OC 的对象中存有引用计数这一整数值 2.调用alloc或是retain方法后,引用计数值加1 3.调用release后,引用计数值减1 4.引用计数值为0时,调用dealloc 方法废除对象

#NSObject-C 苹果实现大概是采用散列表(引用计数表)来管理和引用计数

GNUstep将引用计数保存在对象占有的头部的变量中,而苹果的实现,则是保存在引用计数表的记录中,GNUstep 的实现看起来既简单有高效.而苹果如此必然有他的好处,

#对比 通过内存头部管理引用计数的好处 1.少量代码即可完成 2.能够统一管理引用计数用内存块与对象用内存块

通过引用计数表管理引用计数的好处 1.对象用内存块的分配无需烤炉内存块头部 2.引用计数表各记录中有内存块的地址,可从各个记录追溯到各对象的内存块 3.引用技术表的各记录也有助于检测各对象的持有着是否存在.

#Autorelease

Autorelease就是自动释放 看上去很像ARC 但实际他更类似于C语言中的自动变量(局部变量)的特性 C语言自动变量: 某个自动变量超出其作用域,该自动变量奖杯自动废弃

autorelease 具体使用方法 1.生成并持有NSAutureleasePool对象 2.调用已分配对象的Autorelease实例方法 3.废弃NSAutoreleasePool

NSAutureleasePool 对象的声明周期相当于C语言变量的作用域.对于所有调用过autorelease实例方法的对象,在废弃NSAutoreleasePool时,都会调用release实例方法