美文网首页
内存管理/引用计数 - 思考方式

内存管理/引用计数 - 思考方式

作者: 关灯侠 | 来源:发表于2018-09-01 17:06 被阅读8次

所有内容引用自《Objective-C 高级编程 iOS与OS X多线程和内存管理》,加入了自己的部分理解。

本节小结,点小1跳到底部[1]
第二节、alloc/retain/release/dealloc实现
第三节、autorelease实现

1、 ARC

Automatic Reference Counting,自动引用计数。在LLVM编译器中设置ARC为有效状态,就不再手动添加 retainrelease,编译器会在合适的位置自动加入。

ARC需要满足三个条件:

  • Xcode4.2 及以上版本
  • LLVM 3.0 及以上版本
  • 选项中设置ARC有效

2、内存管理的思考方式

不要只注意在计数上,理解思考方式即可:

  • 自己生成的对象,自己持有
  • 非自己生成的对象,自己也能持有
  • 自己持有的对象,不再需要时释放
  • 非自己持有的对象,不能释放

对象操作和OC方法对应:

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

注:其中Cocoa框架中Foundation框架类库的NSObject类担负内存管理的职责。
alloc/retain/release/dealloc都来自NSObject

自己生成的对象,自己持有

凡是以下名称开头的方法,都是自己生成自己持有:

  • alloc
  • new
  • copy
  • mutableCopy

copy、mutableCopy,生成并持有对象的副本,一个是不可变对象,一个是可变对象。

举个🌰
以下都是自己生成并持有对象:

  • allocObj
  • newObj
  • copyObj
  • mutableCopyObj

以下是错误的🌰:

  • allocate
  • newer
  • copying
  • mutableCopyed

注:以驼峰命名的开头才算是有效的

非自己生成的对象,自己也能持有

🌰

// 生成对象,但不持有,后面会讲原因
id obj = [NSMutableArray  array];

// ARC 自动加上了retain,ARC模式下不要添加
[obj retain];

注:非自己生成的对象,可以通过retain方法来持有。

自己持有的对象,不再需要时释放

使用release方法释放。
自己持有的对象,有两种情况,要么自己生成自己持有的,要么通过retain持有的。

着重说下[NSMutableArray array],为什么能生成对象,但不持有。
举个🌰:

- (id)object{
    // 自己生成,自己持有
    id obj = [[NSObject alloc] init];
    // 对象存在,但自己不持有对象
    [obj autorelease];
     
    return obj; 
}

autorelease使对象在超出指定的生存范围后,可以自动释放,即调用release方法。

简单原理:autorelease先将对象注册到autoreleasepool中,autoreleasepool超出作用域后,会把所有注册在其中的对象都release释放。

注:凡是取得谁都不持有的对象,都是用autorelease实现的。如前面的[NSMutableArray array]

非自己持有的对象,不能释放

注:非自己持有的对象,不能释放,会引起崩溃。


小结

1、内存管理的思考方式:

  • 自己生成的对象,自己持有
  • 非自己生成的对象,自己也能持有
  • 自己持有的对象,不再需要时释放
  • 非自己持有的对象,不能释放

2、以alloc/new/copy/mutableCopy名称开头方法会持有对象,必须以驼峰命名。
3、生成对象,但不持有,都是autorelease实现的。
4、autorelease会把对象注册到自动释放池中,自动释放池结束生命周期时,释放所有对象。


  1. 😊假装是锚点的脚注

相关文章

  • iOS内存管理

    一.内存管理 /引用计数 Objective-C 中的内存管理,也就是引用计数 1.1内存管理的思考方式 自己生成...

  • 目录

    第1章自动引用计数 1.1什么是自动引用计数 1.2内存管理/引用计数 1.2.1概要1.2.2内存管理的思考方式...

  • iOS内存管理思考方式和所有权修饰符

    1、内存管理的思考方式   引用计数式内存管理的思考方式就是思考ARC所引起的变化。   ● 自己生成的对象,自己...

  • 内存管理与引用计数

    引用计数式内存管理的思考方式 引用计数式的内存管理方式主要涉及四个操作:生成对象,持有对象,释放对象,废弃对象。 ...

  • Objective-C高级编程之内存管理篇

    iOS的内存管理是采用引用计数的方式,引用计数分为手动引用计数和自动引用计数(ARC)。前者要求开发者手动管理内存...

  • 读《Objective-C高级编程..》笔记

    第一章、自动引用计数 1、内存管理/引用计数 OC中通过引用计数来进行内存管理(其他的内存管理方式有垃圾回收等) ...

  • iOS 内存管理

    [TOC] 概述 引用计数 MRC - manual retain count 内存管理的思考方式 自己生成的对象...

  • 【iOS小结】内存管理

    MRC下的内存管理 引用计数的思考 Objective-C中的内存管理,也就是引用计数。有关内存管理的方法是包含在...

  • 《Objective-C 高级编程》引用计数 笔记摘要

    内存管理 / 引用计数 内存管理的思考方式 自己生成的对象,自己持有。 非自己生成的对象,自己也能持有。 不再需要...

  • 《Objective-C高级编程 iOS与OS X多线程与内存管

    内存管理篇:1.引用计数的思考方式 自动引用计数 支持条件:clang(LLVM编译器)3.0版本以上objc4 ...

网友评论

      本文标题:内存管理/引用计数 - 思考方式

      本文链接:https://www.haomeiwen.com/subject/hikuwftx.html