浅谈内存开辟问题和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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue render函数_Vue原理解析(一):Vue到底是什么?

Vue,现在前端的当红炸子鸡,随着热度指数上升,实在是有必要从源码的角度,对它功能的实现原理一窥究竟。个人觉得看源码主要是看两样东西,从宏观上来说是它的设计思想和实现原理;微观上来说就是编程技巧&…

scrapy爬虫-setting.py

# Obey robots.txt rulesROBOTSTXT_OBEY False  不遵从网站的robots.txt法则 # See also autothrottle settings and docsDOWNLOAD_DELAY 3  每次下载延迟3秒,防止造成网站攻击 # Override the default request headers:DEFAULT_REQUEST_HEADERS { Accept:…

android点击左上角划出,使用Android中的Path和RectF在左上角右上角左下角绘制圆角...

有一个Path#addRoundRect()重载,它接受一个包含八个值的float数组,其中我们可以为四个角中的每一个指定x和y半径.这些值为[x,y]对,从左上角开始,顺时针绕其余部分.对于我们想要舍入的那些角,我们将该对的两个值都设置为半径值,并将它们保留为零,而不是那些.作为一个说明性示例,…

Nodejs微信开发

因为使用了Bot Framework开发了一个小功能,它目前支持了Skype\Teams\Slack等,但在国内来讲,微信还是一个比较流行的软件,所以需要接上微信 原来开发Bot的时候使用的是.Net开发的,这次我决定使用Nodejs开发一个简单的后…

性别有什么用_为啥不让男孩玩布娃娃?别让你的“性别偏见”,给孩子的人生设限...

在养育孩子的过程中,父母总是会犯许多错误,更是有一些错误会直接使孩子毁掉一生,而性别偏见正是很多家长都会去犯的错误,对男孩和女孩有着刻板印象,也正是因为这一点使孩子的潜力和天赋被压制。前几天我带着孩子去逛商…

android的时间代码怎么写,Android 日期和时间的使用实例详解

Android 日期和时间的使用日期和时间的使用;1:弹出框TimePickerDialog,DatePickerDialog2:组件TimePicker,DatePickerTimePickerDialog的使用:通过点击button显示图一,然后用户可以设置时间DatePickerDialog的使用只需…

andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...

Maven 组件界面介绍如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目。一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4…

Springboot 2.0.0单元测试

1. 引入spring-boot-starter-test包 1 <?xml version"1.0" encoding"UTF-8"?>2 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"3 xsi:schemaLocation"…

SPRING IN ACTION 第4版笔记-第二章-002-@ComponentScan、@Autowired的用法

一、ComponentScan 1. Configuration //说明此类是配置文件 ComponentScan //开启扫描&#xff0c;会扫描当前类的包及其子包 public class CDPlayerConfig { } 2. ComponentScan(basePackages{"soundsystem", "video"})//扫描多个包 public class CDP…

Kurento协议

2019独角兽企业重金招聘Python工程师标准>>> Kurento媒体服务器可以被两种外部Kurento客户端控制&#xff0c;如Java或JavaScript。这些客户端使用Kuernto协议来和KMS通信。Kurento 协议是基于WebSocket协议&#xff0c;并使用了JSON-RPC V2.0 消息来提交请求和发送…

升级php7_PhpStorm 2019.3 发布,全面支持 PHP 7.4

PhpStorm 2019.3 发布了&#xff0c;这个版本主要集中在性能和质量上&#xff0c;旨在提供一个更稳定、更快的 IDE。PhpStorm 2019.3 全面支持 PHP 7.4&#xff0c;还带来 PSR-12 代码样式&#xff0c;用于远程解释器的 WSL&#xff0c;MongoDB 支持&#xff0c;HTTP 客户端更新…

ftp 客户端 使用http代理 源码_代理服务器连接HTTPS过程

说到HTTPS代理很多人瞬间就会联想到HTTPS的各种证书和各种加密&#xff0c;觉得很高端很复杂的样子。其实不然&#xff0c;代理服务器不需要配置证书、也不需要处理任何加密。因为HTTPS代理是通过Web隧道(Web tunnel)工作的。Web隧道允许用户通过HTTP连接发送非HTTP流量(例如FT…

python解zuobiaoxi方程_Python还能解决数学相关问题?大学生:以后就靠他了,事半功倍...

问题背景高等数学应用非常广&#xff0c;基本上涉及到函数的地方都要用到微积分&#xff0c;还有在几何方面也是如此&#xff0c;计算机的应用让我们能简单快速处理各种高等数学中的计算&#xff0c;比如极限、导数、积分、微分方程等的计算。实验目的使用 Python 通过计算与作…

Android版:验证手机号码的正则表达式 (转)

/** * 验证手机格式 */ public static boolean isMobileNO(String mobiles) { /* 移动&#xff1a;134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 联通&#xff1a;130、131、132、152、155、156、185、186 电信&#xff1a;133、…

基础正则表达式介绍与练习

基础正则表达式介绍与练习 一、什么是正则表达式 在做文字处理或编写程序时&#xff0c;用到查找、替换等功能&#xff0c;使用正则表达式能够简单快捷的完成目标。简单而言&#xff0c;正则表达式通过一些特殊符号的帮助&#xff0c;使用户可以轻松快捷的完成查找、删除、替换…

android canvas 网络图,【巨坑:toDataURL】canvas合成网络图片

不知有没有小伙伴用过canvas合成图片&#xff0c;然后爆炸报错截图尼玛&#xff0c;然后各种搜索&#xff0c;不外乎以下几种坑爹处理方案&#xff1a;后端处理&#xff0c;比如Access-Control-Allow-Origin "*"(要是请求到其他网站的图片就不适用了&#xff0c;比如…

水晶报表如何查看sql_有了这个报表工具,一键生成自定义的各种报表,还可以导出Excel...

EasyReport是一个简单易用的Web报表工具,它的主要功能是把SQL语句查询出的数据转换成报表页面&#xff0c; 同时支持表格的跨行(RowSpan)与跨列(ColSpan)配置。 同时它还支持报表Excel导出、图表显示及固定表头与左边列的功能。功能介绍本工具从数据库(MySQL,Oracle,SQLServer,…

python 三维向量 交互_Blender实现Nature of Code1.5单位向量[Nature of Node 004]

【Nature of Node #004】Blender创意编程进阶应用&#xff1a;实现Nature of CodeNature of Code 1.5, Unit Vector (Normalize)背景介绍这个系列“Nature of Node”&#xff0c;是专门用Blender的Node&#xff08;节点&#xff09;方式来实现Nature of Code。用到一个Blender插…

Sitemesh3的使用及配置

1 . Sitemesh 3 简介 Sitemesh 是一个网页布局和修饰的框架&#xff0c;基于 Servlet 中的 Filter&#xff0c;类似于 ASP.NET 中的‘母版页’技术。参考&#xff1a;百度百科&#xff0c;相关类似技术&#xff1a;Apache Tiles。 官网&#xff1a;http://wiki.sitemesh.org/wi…

等保项目流程

等级保护&#xff1a;直属管理公安局 产品必须通过公安局安全许可证分级保护&#xff1a;直属管理保密局 产品必须通过保密局销售许可证等级保护&#xff1a;一般分为5级&#xff0c;目前最高用到是等保4级总概&#xff1a;定级——前期调研——总…