iOS block种类和切换

news/2024/7/20 12:34:29 标签: 内存管理

block 分为三种 NSGlobalBlock,NSStackBlock, NSMallocBlock。

  • NSGlobalBlock:类似函数,位于text段;
  • NSStackBlock:位于栈内存,函数返回后Block将无效;
  • NSMallocBlock:位于堆内存。

NSGlobalBlock我们可以通过是否引用外部变量来识别,未引用外部变量即为NSGlobalBlock,可以当做函数使用。否则是NSStackBlock。

NSMallocBlock只需要对NSStackBlock进行copy操作就可以获取,但是retain操作就不行

 

  • 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操作。

更详细的block的内容,请访问原博文:http://www.cnblogs.com/hanjun/p/3767394.html

 

转载于:https://www.cnblogs.com/lihaiyin/p/4666930.html


http://www.niftyadmin.cn/n/1387731.html

相关文章

Ubuntu 20 语言支持(language-support)闪退打不开的解决方案

说实话这个问题也不怎么难,但是在网上还真百度/google不出来一针见血的博客, 场景 系统:组装台式机下Ubuntu20.04 问题描述: 打开Ubuntu的语言支持的时候闪退,有的时候不会提示问你要不要给Ubuntu发送错误邮件 操作如…

开学咯.......

开学咯.........课也没得上了!现在就是等着做完毕业设计就要找工作了!还真不知道找个怎么样的工作才好啊!现在的社会啊真的是太残酷了啊转载于:https://blog.51cto.com/zc0322/130615

bzoj1303

数学题 1 #include<cstdio>2 #include<cstring>3 #include<cmath>4 #include<ctime>5 #include<cstdlib>6 #include<iostream>7 #include<algorithm>8 #define clr(a,x) memset(a,x,sizeof(a))9 #define rep(i,l,r) for(int il;i<…

(转)MFC模态对话框和非模态对话框

http://blog.csdn.net/candyliuxj/article/details/6736032 MFC中对话框有两种形式&#xff0c;一个是模态对话框&#xff08;model dialog box&#xff09;&#xff0c;一个是非模态对话框&#xff08;modeless dialog box&#xff09;。 一、模态对话框&#xff08;model dia…

Ubuntu20安装clickhouse最新版本详细教程

文章目录环境说明&#xff1a;安装步骤&#xff1a;第1步&#xff1a;检查是否支持SSE4.2第2步&#xff1a;为apt添加clickhouse仓库第3步&#xff1a;添加依赖并更新apt数据库第4步&#xff1a;安装clickhouse服务端及客户端第5步&#xff1a;启动clickhouse第6步&#xff1a;…

《HTML5 Canvas游戏开发实战》——1.4 开发工具的选择

本节书摘来自华章计算机《HTML5 Canvas游戏开发实战》一书中的第1章&#xff0c;第1.4节,作者&#xff1a;张路斌著&#xff0c; 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.4 开发工具的选择 对于HTML5的开发来说&#xff0c;在开发工具方面没有特殊的要求&a…

SAP 外部数据库连接支持文件的文件名清单

在 SAP 中使用 NativeSQL 访问外部数据库时&#xff0c;需要在系统的 SAP\<sid>\SYS\exe\run 目录下放置相应的支持文件&#xff08;Windows 下是 dll 动态链接库&#xff09;。但是这些文件在 SAP Support Portal 上很难寻找&#xff0c;我至今也没有通过分类找到过它们…

linux命令-- 手动释放linux内存

在服务器运行过程中&#xff0c;使用free -m查看服务器内存时&#xff0c;经常会发现free值很小&#xff0c;有些同学就会很紧张&#xff0c;总想采取一些措施&#xff0c;使得free值看起来高一点&#xff0c;心里就比较爽一点。其实&#xff0c;个人觉得这完全是图一时之快&am…