------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之--自动释放池的概念以及使用相关推荐

  1. 黑马程序员Java零基础视频教程笔记-Java基础概念

    文章目录 一.注释 二.关键字 三.字面量 四.变量 五.数据存储 六.数据类型 七.标识符 八.键盘录入 一.注释 1. 定义 注释就是对代码进行解释说明的文字 2. 注释的分类 ① 单行注释:// ...

  2. 黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...

  3. Objective-c自学笔记(5)-自动释放池

    解决的问题 每一个东西的产生都是在实际生活迫切需要这样的东西后,人们通过思考发明创造某些东西用以解决这个问题.那么自动释放池用来解决什么问题?请看下面的例子: 对于一些有返回值的消息(方法),它返回的 ...

  4. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  5. 【黑马程序员 C++教程从0到1入门编程】【笔记3】C++核心编程(内存分区模型、引用、函数提高)

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后(手动开辟内存:c语言malloc,c++new) 1.3 new操作 ...

  6. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  7. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  8. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

  9. 黑马程序员——收集起来的ios笔试题——黑马 ios 技术博客

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面试能力要求:精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义U ...

最新文章

  1. 无论是舆论风波,还是实力较量,BCH从来就没有怕过
  2. cuda 核函数 for循环_【CUDA 基础】6.2 并发内核执行
  3. hbase获取region以及读取每个region的第一行
  4. 一般试卷的纸张大小是多少_pdf试卷怎么打印在A3纸上
  5. jmeter添加html,Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告...
  6. Linux 环境 C语言 操作MySql 的接口范例
  7. 蔚来上线三款硬货:更大电池包、全新EC6、改款ES8
  8. win10的11对战平台突然无法启动魔兽
  9. 在线sql服务器,SQL Server链接服务器
  10. php数组教程,PHP 数组入门教程小结
  11. qq和qq浏览器的区别
  12. orangepizero编译ch934x驱动
  13. [Xcode 实际操作]七、文件与数据-(18)使用MarkMan与设计师进行心灵沟通
  14. 【Kernel】驱动开发学习之Platform平台总线模型
  15. 关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解
  16. 云平台SLB详细介绍和实战演练
  17. 【LeetCode】1823. 找出游戏的获胜者 Find the Winner of the Circular Game
  18. vue移动端滑动切换图片的一个简单思路
  19. python处在哪个阶段_如何在学Python的过程中更好地成长技术
  20. 2022 中秋节,晒下新浪的月饼,另外留言送红包

热门文章

  1. 人生六十才开始(转载)
  2. OpenGL 基本介绍
  3. 基于单片机的电子琴系统设计(#0424)
  4. Python编码,解码问题
  5. 一个女人频繁做这些事,真的很爱你
  6. FileFilter 文件过滤器
  7. 【时间之外】2021年这些伪黑科技概念要提防
  8. Jmockit使用指南
  9. 题目:输入某年某月某日,判断当日是星期几? 提示:1900年1月1日为星期一
  10. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告