OC内存管理(二)--MRC

来源:互联网 发布:中韩萨德问题 知乎 编辑:程序博客网 时间:2024/06/04 18:16

上篇讲述了ARC(自动内存管理),这篇了解一下ARC之前的故事。

1.引用计数 – Objective-C中的内存管理
举个例子:有一条狗(对象生成),一个人拿条绳索牵着它,它的引用计数为1,又来了一个人,又用一根绳索牵着它,它的引用计数就是2,再来一个人再系上引用计数就是3。当一个人离开的时候,它就放开了手中的绳索,此时它的引用计数为2,当最后一个人放开绳索的时候引用计数为0,狗狗就被释放了。

2.内存管理的思考方式

  1. 自己生成的对象自己持有
  2. 非自己生成的对象自己也可以持有
  3. 不再需要自己持有的对象的时候释放
  4. 非自己持有的对象无法释放

对象操作与Objective-C方法的对应

对象操作 ——> Objective-C方法
生成并持有对象 —–> alloc/new/copy/mutableCopy等方法
持有对象 —–> retain 方法
释放对象 —–> release 方法
废弃对象 —–> dealloc 方法

3.思考方式详解

  • 生成并持有对象(alloc/new/copy/mutableCopy等方法)
    只以alloc为例
    /**     *  自己生成并持有对象     */    NSObject *obj = [[NSObject alloc] init];    /**     *  自己持有对象     */
  • 持有对象(retain 方法)
    上面有自己生成并持有对象 这里举个非自己生成并持有对象
/**     *  取得非自己生成并持有对象     */    id obj = [NSMutableArray array];    /**     *  取得的对象存在但自己不持有     */
/**     *  取得非自己生成并持有对象     */    id obj = [NSMutableArray array];    /**     *  取得的对象存在但自己不持有     */    [obj retain];    /**     *  自己持有对象     */

那自己如何写非自己生成但存在的对象方法呢,以下便是啦

- (id)object{    id obj = [[NSObject alloc] init];    /**     *  自己持有对象     */    [obj autorelease];    /**     *  取得的对象存在但自己不持有     */    return obj;}
  • 释放对象(release 方法)
    /**     *  自己生成并持有对象     */    NSObject *obj = [[NSObject alloc] init];    /**     *  自己持有对象     */    [obj release];    /**     *  释放对象     指向对象的指针仍然被保留在变量obj中,貌似能够访问     但对象一经释放绝对不可访问     */

其中release方法一经调用对象立即被释放,autorelease则是使对象在超出指定的生存范围时能够自动并正确地释放

  • 废弃对象(dealloc 方法)

–总结自《Objective-C高级编程 - iOS与OS X多线程和内存管理》 黎华 译

1 0