转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/

第六讲:Obj-C 内存管理4 - 自动释放池

主要内容
      什么是自动释放池
      自动释放池的好处
      如何创建一个自动释放池
      自动释放池如何释放对象内存

自动释放池栈式结构管理

Autorelease pool
     1. 自动释放池(Autorelease Pool)是 OC 的一种内存自动回收机制,可以将一些临时变量通过自动释放吃来回收统一释放
     2. 当自动释放池本身销毁的时候,池子里所有的对象都会做一次 release 操作

autorelease

      任何OC对象只要调用 autorelease 方法,就会把该对象放大离自己最近的自动释放池中(栈顶的释放池)

创建自动释放池 (两种方法)

IOS5.0 新方式
     @ autoreleasepool
      {
      }

IOS5.0 之前的老方式
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

[pool release];

遛狗原理

典型例子(正确)
      Dog *dog1 = [[Dog alloc] init];
      [xiaoLi setDog:dog1];
     [dog1 release];

典型例子 (错误)
      [xiaoLi setDog:[[Dog alloc] init]];
      上述代码有内存泄漏

典型例子(正确)好的方法
     Dog *dog = [[[Dog alloc] init] autorelease];
      [xiaoLi setDog:dog1];
      //这里不能跟 [dog1 release];

典型例子(正确) 放成一行
      [xiaoLi setDog:[[[Dog alloc] init] autorelease]];

黄金法则
      如果对一个对象使用了 alloc, [mutable]copy, retain,那么必须使用相应的 release 或者 autorelease

举例

// Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property int ID; @end

// Dog.m #import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void) dealloc { NSLog(@"dog %d dealloc", _ID); [super dealloc]; } @end

// Person.h #import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject { Dog *_dog; } @property (retain) Dog *dog; @end

// Person.m #import "Person.h" @implementation Person @synthesize dog = _dog; - (void) dealloc { self.dog = nil; NSLog(@"person dealloc"); [super dealloc]; } @end

// main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h" int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, World!"); Person *xiaoLi = [[Person alloc] init]; Dog *dog1 = [[[Dog alloc] init] autorelease]; // 把 dog1 这条狗放在自动释放池里,上边的pool中 NSLog(@"dog1 retaincount is %ld", [dog1 retainCount]); xiaoLi.dog = dog1; NSLog(@"dog1 retaincount2 is %ld", [dog1 retainCount]); // [dog1 release]; // autorelease 了,不需要再 release [xiaoLi release]; NSLog(@"dog1 retaincount3 is %ld", [dog1 retainCount]); [pool release]; NSLog(@"end of release"); return 0; } /* 输出结果 Hello, World! dog1 retaincount is 1 dog1 retaincount2 is 2 person dealloc dog1 retaincount3 is 1 dog 0 dealloc end of release */

转载于:https://www.cnblogs.com/jackljf/archive/2013/03/07/3589250.html

第六讲:Obj-C 内存管理4 - 自动释放池相关推荐

  1. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池

    先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...

  2. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  3. 【iOS高级资深工程师面试篇】④、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 内存管理部分2/2 引用计数-弱引用-自动释放池-循环引用

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  4. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池

    2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...

  5. iOS内存管理 —— 自动释放池和runloop

    iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...

  6. iOS中内存自动释放池

    自动释放池 iOS应用的主线程在每次runloop开始的时候创建自动释放池,在runloop结束的时候释放自动释放池.如果在一个runloop内,应用程序创建了大量临时对象,自动释放池可以减少内存峰值 ...

  7. cocos2d-x游戏开发(六)自动释放池

    欢迎转载:http://blog.csdn.net/fylz1125/article/details/8519887 上一篇文章写了引用计数和自动释放的大概流程,其中略过了自动释放池,这里简单述说. ...

  8. C++动态内存会被自动释放吗?

    C++动态内存会被自动释放吗? 函数体内的局部变量在函数结束时自动消亡.很多人误以为示例7-6是正确的.理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋.这是错觉! void Fun ...

  9. Oracle 内存一 手动内存管理,自动内存管理

    oracle的内存分为两个部分.一个是SGA(system global area),一个是PGA(program global area).所谓的内存管理,就是对这两部分区域进行管理.oracle的 ...

最新文章

  1. 基本套接字总结(@function)
  2. Java如何通过WSDL文件来调用这些web service
  3. 联机日志损坏时的恢复(非正常关闭数据库)
  4. 推荐前端性能优化辅助工具Google LightHouse (灯塔)
  5. oss/bss/mss转自搜搜百科
  6. 苹果高通关系紧张背后:不只是专利问题 还有两家公司CEO的私人恩怨
  7. webdriver原理(自己做个记录)
  8. mysql 给表填充数据库_mysql---为测试数据库填充大量数据
  9. python表白代码大全简单-python表白代码
  10. stardict词典全集
  11. 阿里云数据库(hk)连接不上处理方法
  12. 基于WebGIS的电子政务应用(基于J2EE的MVC架构)
  13. 如何配置 Cilium 和 BGP 协同工作?
  14. Linux网络编程(四)
  15. 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP ShaderGraph Decal)
  16. 2018年电子设计大赛主要元器件、模块资料汇总
  17. java数组初始化0_Java自学-数组 初始化数组
  18. #error: MFC does not support WINVER less than 0x0501.
  19. 比江小白杜蕾斯还要清新,这些文案,可能这就是青春吧!
  20. wml 与服务器交互

热门文章

  1. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法
  2. SSH2+Daoz项目中的分页查询
  3. Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法...
  4. dietlibc中的strcpy算法浅析
  5. 开篇词 | 别说你没被安全困扰过
  6. gj6 深入python的set和dict
  7. tableau双折线图_Tableau可视化之多变条形图
  8. 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)
  9. react 组件遍历】_从 Context 源码实现谈 React 性能优化
  10. 如何利用云原生技术构建现代化应用?