第六讲:Obj-C 内存管理4 - 自动释放池
转: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 - 自动释放池相关推荐
- 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- 【iOS高级资深工程师面试篇】④、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 内存管理部分2/2 引用计数-弱引用-自动释放池-循环引用
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池
2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...
- iOS内存管理 —— 自动释放池和runloop
iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...
- iOS中内存自动释放池
自动释放池 iOS应用的主线程在每次runloop开始的时候创建自动释放池,在runloop结束的时候释放自动释放池.如果在一个runloop内,应用程序创建了大量临时对象,自动释放池可以减少内存峰值 ...
- cocos2d-x游戏开发(六)自动释放池
欢迎转载:http://blog.csdn.net/fylz1125/article/details/8519887 上一篇文章写了引用计数和自动释放的大概流程,其中略过了自动释放池,这里简单述说. ...
- C++动态内存会被自动释放吗?
C++动态内存会被自动释放吗? 函数体内的局部变量在函数结束时自动消亡.很多人误以为示例7-6是正确的.理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋.这是错觉! void Fun ...
- Oracle 内存一 手动内存管理,自动内存管理
oracle的内存分为两个部分.一个是SGA(system global area),一个是PGA(program global area).所谓的内存管理,就是对这两部分区域进行管理.oracle的 ...
最新文章
- 基本套接字总结(@function)
- Java如何通过WSDL文件来调用这些web service
- 联机日志损坏时的恢复(非正常关闭数据库)
- 推荐前端性能优化辅助工具Google LightHouse (灯塔)
- oss/bss/mss转自搜搜百科
- 苹果高通关系紧张背后:不只是专利问题 还有两家公司CEO的私人恩怨
- webdriver原理(自己做个记录)
- mysql 给表填充数据库_mysql---为测试数据库填充大量数据
- python表白代码大全简单-python表白代码
- stardict词典全集
- 阿里云数据库(hk)连接不上处理方法
- 基于WebGIS的电子政务应用(基于J2EE的MVC架构)
- 如何配置 Cilium 和 BGP 协同工作?
- Linux网络编程(四)
- 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP ShaderGraph Decal)
- 2018年电子设计大赛主要元器件、模块资料汇总
- java数组初始化0_Java自学-数组 初始化数组
- #error: MFC does not support WINVER less than 0x0501.
- 比江小白杜蕾斯还要清新,这些文案,可能这就是青春吧!
- wml 与服务器交互
热门文章
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法
- SSH2+Daoz项目中的分页查询
- Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法...
- dietlibc中的strcpy算法浅析
- 开篇词 | 别说你没被安全困扰过
- gj6 深入python的set和dict
- tableau双折线图_Tableau可视化之多变条形图
- 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)
- react 组件遍历】_从 Context 源码实现谈 React 性能优化
- 如何利用云原生技术构建现代化应用?