[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数

来源:互联网 发布:edm邮件制作软件 编辑:程序博客网 时间:2024/04/24 08:22

本书第十六章讲解的时关于文件和目录的操作,内容相对简单,再次略过。
第十七章的学习笔记经本人归纳整理呈献给大家。

内存管理:
- 为了被占用的内存能够再次利用,通过内存管理清理不用的内存。如果一个对象不再使用,就需要释放对象占用的内存

Part 1. 基本内存管理模型

Part 1.1 自动垃圾收集:

  • 系统能够自动贾策对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会被自动释放

Part 1.2 手工管理内存计数:

  • 每当创建引用到对象的时候需要为引用数+1。[myFraction retain]
  • 不再需要对象时,给对象发送release消息,为引用数-1。[myFraction release]
  • 当对象的引用计数为0的时候,系统就知道这个对象不再需要使用了。

Part 1.3 自动引用计数(ARC):

  • 系统会检测出何时需要保持对象,何时需要自动释放对象,何时释放对象。

Part 2. autoreleasepool块

  • 自动释放池并不包括实际的对象,只是包含对象的引用,对象将在自动释放池被清理的时候被释放。
  • 将对象添加到自动释放池维护的对象列表中:[result autorelease]
  • 清空自动释放池:给自动释放池添加drain消息
  • 当执行到autorelease块的末尾时,系统会释放池。
  • alloc,copy,mutable,new为前缀的方法创建的对象都不会被自动释放。需要在使用完这些对象后负责释放这些对象的内存。主动给这些对象发送release 消息,或者给对象发送autorelease消息将对象加入到自动释放池中。(主动释放对象
  • 方法返回对象的情况下:将对象放到自动释放池中 : return [result autorelease]Fraction *result = [[[Fraction alloc] init ] autorelease]

    • 管理每次由for循环迭代创建的临时对象
for (i = 0; i < n; ++i){  @autoreleasepool{    ...临时对象...  }}

Part 3. 时间循环和内存分配

  • 为了处理新事件,系统会创建一个新的自动释放池。
  • 调用应用中的一些方法来处理这个事件,方法返回后,系统清理自动释放池。
  • 创建的自动释放对象都被销毁,除非使用retain,才能从清空自动释放池的过程中幸存下来。

Part 4. 强变量 和 弱变量

强变量:

  • 所有对象的指针都是强变量
  • 旧对象的引用会在赋值前被释放。
  • 声明对象:__strong Fraction *f1
  • 声明属性:@property(strong, nonatomic) NSMutableArray *birdNames;

弱变量

  • 系统会追踪这个变量的引用。当引用的对象释放时,若变量会被设置为nil
  • 声明对象:__week UIView *parentView;
  • 声明属性:@property(week, nonatomic) UIView *parentView;
0 0