浅谈内存开辟问题和Block内存问题
我们知道,内存分为栈,堆,块。
栈中的内存由系统自己释放,堆是存对象初始化的地方,块是CPU与内存连接的缓冲器,运行速度比内存快,比CPU慢。
例如,我们NSMutableArray *array = [NSMutableArrar new];
NSMutableArray *array就在栈中,NSMutableArray类型的指针。[NSMutableArray new]开辟的内存在堆中,我们可以理解为
NSMutableArray *array --->[NSMutableArrar new];
栈中的指针指向堆中的对象。
我们用static或者const关键字定义常量,一般在内存块中开辟内存空间。在块中开辟内存空间的对象读写速度最快,但是我们要注意,块的内存很小。
block代码是在块中执行的,所以它的运行速度要比delegate等效率高。但是使用block容易造成内存泄露。
原因在网上找到了:http://www.cnblogs.com/hanjun/p/3767394.html
- NSGlobalBlock:类似函数,位于text段;我们可以通过是否引用外部变量识别,未引用外部变量即为NSGlobalBlock,可以当做函数使用。
- NSStackBlock:位于栈内存,函数返回后Block将无效;
- NSMallocBlock:位于堆内存,NSMallocBlock只需要对NSStackBlock进行copy操作就可以获取。
- Block_copy与copy等效,Block_release与release等效;
- 对Block不管是retain、copy、release都不会改变引用计数retainCount,retainCount始终是1;
- NSGlobalBlock:retain、copy、release操作都无效;
- NSStackBlock:retain、release操作无效,必须注意的是,NSStackBlock在函数返回后,Block内存将被回收。即使retain也没用。容易犯的错误是[[mutableAarry addObject:stackBlock],(补:在arc中不用担心此问题,因为arc中会默认将实例化的block拷贝到堆上)在函数出栈后,从mutableAarry中取到的stackBlock已经被回收,变成了野指针。正确的做法是先将stackBlock copy到堆上,然后加入数组:[mutableAarry addObject:[[stackBlock copy] autorelease]]。支持copy,copy之后生成新的NSMallocBlock类型对象。
- NSMallocBlock支持retain、release,虽然retainCount始终是1,但内存管理器中仍然会增加、减少计数。copy之后不会生成新的对象,只是增加了一次引用,类似retain;
- 尽量不要对Block使用retain操作。
转载于:https://www.cnblogs.com/hansIOS/p/5228352.html
浅谈内存开辟问题和Block内存问题相关推荐
- 浅谈asio中async_accept函数占用内存高的写法
相比大家都使用过asio 中的async_accpect如果使用的好,内存会占用的小,下面来看一端实列:
- 浅谈指针(二级指针动态分配内存)
指针 指针的本质是地址 指针变量 指针变量是一个能存储地址的变量 定义: DataType *变量名; 其中( DataType * ) 是地址类型(地址是有类型的!)(例如定义一个 int 型变量 ...
- 浅谈C语言动态内存分配及柔性数组
文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...
- 乐学python怎么样_铁乐学Python_day07_集合and浅谈深浅copy
1.[List补充] 在循环一个列表时,最好不要使用元素和索引进行删除操作,一旦删除,索引会随之改变,容易出错. 如果想不出错,可以采用倒着删除的方法,因为倒着删除进行的话,只是后面元素的位置发生了变 ...
- 《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)
宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要. 目录 前言 动态内存产生的原因 动态内存函数 malloc ...
- 多线程之旅之四——浅谈内存模型和用户态同步机制
用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作 interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...
- 浅谈C语言内存(栈)
浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...
- Linux内核之浅谈内存寻址
Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...
- 【JVM调优】JVM内存管理调优浅谈
什么是JVM Java Virtual Machine,Java虚拟机 Java虚拟机有自己完善的硬件架构,如处理器.堆栈等,还具有相应的指令系统. Java虚拟机本质上就是一个程序,当它在命令行上启 ...
最新文章
- php ?redis,PHP使用Redis存储Session
- mysql sql select for update_mysql SELECT FOR UPDATE语句使用示例
- 阿里二面差点败在这道题:MySQL自增主键为何不是连续的呢?
- 软件测试跟踪工具Bugzilla的安装 - Linux版本
- 实践篇(1)--QPG之“打狗棍法”
- 用javaScript实现轮播图效果 包括自动变换,按钮控制,上一张下一张切换
- LayoutInflater Factory
- Mac下修改HD3000显存到1GB
- 推荐十五款APP原型设计工具
- 微信小程序自定义组件中对properties的修改
- 有关暴雷商誉减值企业的识别
- 进阿里一年中最好的机会
- 如何准备机器学习数据集_机器学习演练第一部分:准备数据
- 10种最热门的编程语言出道至今历史排行情况-2020年TIOBE最新
- 常微分方程数值解matlab欧拉,MATLAB题,用到欧拉公式求微分方程的数值解
- pycharm能不能编写Java_使用Pycharm编写第一个Python程序
- SpringBoot2.0集成Shiro
- 122412_0529_WORD2013BLO1
- 如何在给虚拟机设置静态IP
- Arduino项目专用的Beetle CM-32U4微控制器
热门文章
- android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程
- java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
- slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
- linux mysql启动_MySQL 安装(二)
- java linkedhashset_java之LinkedHashSet
- 微机原理——扩展存储器设计
- c# 命名空间命名规范_C#中的命名空间
- 03-对图像进行数值计算和加权融合
- 2013年 833c语言程序 江南大学 (A卷)
- [python] 命令行模式下出现cp65001异常