我们知道,内存分为栈,堆,块。

栈中的内存由系统自己释放,堆是存对象初始化的地方,块是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内存问题相关推荐

  1. 浅谈asio中async_accept函数占用内存高的写法

    相比大家都使用过asio 中的async_accpect如果使用的好,内存会占用的小,下面来看一端实列:

  2. 浅谈指针(二级指针动态分配内存)

    指针 指针的本质是地址 指针变量 指针变量是一个能存储地址的变量 定义: DataType *变量名; 其中( DataType * ) 是地址类型(地址是有类型的!)(例如定义一个 int 型变量 ...

  3. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  4. 乐学python怎么样_铁乐学Python_day07_集合and浅谈深浅copy

    1.[List补充] 在循环一个列表时,最好不要使用元素和索引进行删除操作,一旦删除,索引会随之改变,容易出错. 如果想不出错,可以采用倒着删除的方法,因为倒着删除进行的话,只是后面元素的位置发生了变 ...

  5. 《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)

    宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要. 目录 前言 动态内存产生的原因 动态内存函数 malloc ...

  6. 多线程之旅之四——浅谈内存模型和用户态同步机制

     用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作   interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...

  7. 浅谈C语言内存(栈)

    浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...

  8. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  9. 【JVM调优】JVM内存管理调优浅谈

    什么是JVM Java Virtual Machine,Java虚拟机 Java虚拟机有自己完善的硬件架构,如处理器.堆栈等,还具有相应的指令系统. Java虚拟机本质上就是一个程序,当它在命令行上启 ...

最新文章

  1. php ?redis,PHP使用Redis存储Session
  2. mysql sql select for update_mysql SELECT FOR UPDATE语句使用示例
  3. 阿里二面差点败在这道题:MySQL自增主键为何不是连续的呢?
  4. 软件测试跟踪工具Bugzilla的安装 - Linux版本
  5. 实践篇(1)--QPG之“打狗棍法”
  6. 用javaScript实现轮播图效果 包括自动变换,按钮控制,上一张下一张切换
  7. LayoutInflater Factory
  8. Mac下修改HD3000显存到1GB
  9. 推荐十五款APP原型设计工具
  10. 微信小程序自定义组件中对properties的修改
  11. 有关暴雷商誉减值企业的识别
  12. 进阿里一年中最好的机会
  13. 如何准备机器学习数据集_机器学习演练第一部分:准备数据
  14. 10种最热门的编程语言出道至今历史排行情况-2020年TIOBE最新
  15. 常微分方程数值解matlab欧拉,MATLAB题,用到欧拉公式求微分方程的数值解
  16. pycharm能不能编写Java_使用Pycharm编写第一个Python程序
  17. SpringBoot2.0集成Shiro
  18. 122412_0529_WORD2013BLO1
  19. 如何在给虚拟机设置静态IP
  20. Arduino项目专用的Beetle CM-32U4微控制器

热门文章

  1. android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程
  2. java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
  3. slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
  4. linux mysql启动_MySQL 安装(二)
  5. java linkedhashset_java之LinkedHashSet
  6. 微机原理——扩展存储器设计
  7. c# 命名空间命名规范_C#中的命名空间
  8. 03-对图像进行数值计算和加权融合
  9. 2013年 833c语言程序 江南大学 (A卷)
  10. [python] 命令行模式下出现cp65001异常