黑马程序员--Objective-C之--自动释放池的概念以及使用
------IOS培训期待与您交流! -------
今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念
一、数组对象是如何处理对象元素的引用计数问题
// // main.m // 26_NSArrayMemeryManager // // Created by waterfoxjie on 15-03-29. // Copyright (c) 2015年 waterfoxjie. All rights reserved. // #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const charchar * argv[]) { Dog *dog1 = [[Dog alloc] init]; Dog *dog2 = [[Dog alloc] init]; NSMutableArray *array = [[NSMutableArray alloc] init]; //数组会对每一个元素retain [array addObject:dog1]; //dog1计数=2 [array addObject:dog2]; //dog2计数=2 [dog1 release]; [dog2 release]; //当数组销毁的时候,会将所有的元素release [array release];//数组销毁 //当数组移除所有的元素的时候,会讲所有的元素release [array removeAllObjects]; return 0; }
我们定义了Dog类,然后定义了NSMutableArray数组存放两个Dog对象,OC中在将对象放到数组中的时候,会自动调用retain方法,当数组对象本身被销毁的时候,会调用
所有元素的release方法,当移除数组中所有的元素的时候,会调用元素的release方法
二、自动释放池的概念
// // main.m // 27_AutoReleasePool // // Created by waterfoxjie on 15-03-29. // Copyright (c) 2015年 waterfoxjie. All rights reserved. // #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const charchar * argv[]) { /* //创建一个自动释放池 //有作用域的问题,在{}中定义的东西外部是不能访问的,这点和NSAutoreleasePool有区别的 @autoreleasepool {//等价于[[NSAutoreleasePool alloc] init] Dog *dog2 = [[Dog alloc] init]; [dog2 retain]; }//等价于[pool release] //创建一个自动释放池 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Dog *dog1 = [[Dog alloc] init];//计数:1 //将dog1对象加入到自动释放池中,却别于之前的release方法 //加入到自动释放池中之后,不是代表我们不需要管理引用了,只是自动释放池自动会调用一次release //当自动释放池销毁的时候,释放池会对池中每一个对象调用一次release [dog1 autorelease]; NSLog(@"dog1计数:%ld",dog1.retainCount); //销毁自动释放池 //这时候会调用dog1的release方法,dog1对象就被销毁了 [pool release]; */ //自动释放池的嵌套 NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init]; //添加我们的代码 //dog1放到了pool1中 Dog *dog1 = [[Dog alloc] init]; [dog1 autorelease]; //自动释放池的嵌套 NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init]; //dog2放到了pool2中 Dog *dog2 = [[Dog alloc] init]; [dog2 autorelease]; //pool2销毁了 [pool2 autorelease]; //pool1销毁了 [pool1 release]; //下面的代码就是有问题的 //[person setDog:[[Dog alloc] init]; //正确的写法 //Dog *dogs = [[[Dog alloc] init] autorelease]; return 0; }
我们在之前的文章中,定义一个对象的时候都会产生一个自动释放池,然后在释放池中编写我们的代码,自动释放池是系统提供的一种帮助我们去管理对象的引用计数问题。
但是有时候代码必须在{...}中编写,这样的话就会产生作用域的问题,就是在{...}中定义的变量,在{...}外面不能使用。
所以OC中就有 了另外的一种方式:NSAutoreleasePool这个类
这种自动释放池可以实现嵌套
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];//write code...//pool1销毁了 [pool1 release];
上面的代码就相当于建立了一个自动释放池pool1,但是在这个中间的代码,如果要加入到这个池中,必须调用autorelease方法:
//dog1放到了pool1中 Dog *dog1 = [[Dog alloc] init]; [dog1 autorelease];
而且,这样定义一个池子还可以嵌套使用,直接看上面的例子代码,这样这个自动释放池我们就可以控制了。比系统提供的自动释放池可操作的地方很多
下面就直接对比一下:
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];//这行代码就相当于系统自动释放池的 {[pool1 release];//这行代码就相当于系统自动释放池的 }
这样就好理解了吧
转载于:https://www.cnblogs.com/waterfox/p/4376921.html
黑马程序员--Objective-C之--自动释放池的概念以及使用相关推荐
- 黑马程序员Java零基础视频教程笔记-Java基础概念
文章目录 一.注释 二.关键字 三.字面量 四.变量 五.数据存储 六.数据类型 七.标识符 八.键盘录入 一.注释 1. 定义 注释就是对代码进行解释说明的文字 2. 注释的分类 ① 单行注释:// ...
- 黑马程序员入学Java知识——精华总结
黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...
- Objective-c自学笔记(5)-自动释放池
解决的问题 每一个东西的产生都是在实际生活迫切需要这样的东西后,人们通过思考发明创造某些东西用以解决这个问题.那么自动释放池用来解决什么问题?请看下面的例子: 对于一些有返回值的消息(方法),它返回的 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记3】C++核心编程(内存分区模型、引用、函数提高)
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后(手动开辟内存:c语言malloc,c++new) 1.3 new操作 ...
- 黑马程序员C语言基础(第七天)内存管理
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
- 黑马程序员——收集起来的ios笔试题——黑马 ios 技术博客
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面试能力要求:精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义U ...
最新文章
- 无论是舆论风波,还是实力较量,BCH从来就没有怕过
- cuda 核函数 for循环_【CUDA 基础】6.2 并发内核执行
- hbase获取region以及读取每个region的第一行
- 一般试卷的纸张大小是多少_pdf试卷怎么打印在A3纸上
- jmeter添加html,Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告...
- Linux 环境 C语言 操作MySql 的接口范例
- 蔚来上线三款硬货:更大电池包、全新EC6、改款ES8
- win10的11对战平台突然无法启动魔兽
- 在线sql服务器,SQL Server链接服务器
- php数组教程,PHP 数组入门教程小结
- qq和qq浏览器的区别
- orangepizero编译ch934x驱动
- [Xcode 实际操作]七、文件与数据-(18)使用MarkMan与设计师进行心灵沟通
- 【Kernel】驱动开发学习之Platform平台总线模型
- 关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解
- 云平台SLB详细介绍和实战演练
- 【LeetCode】1823. 找出游戏的获胜者 Find the Winner of the Circular Game
- vue移动端滑动切换图片的一个简单思路
- python处在哪个阶段_如何在学Python的过程中更好地成长技术
- 2022 中秋节,晒下新浪的月饼,另外留言送红包