Block学习总结
最近网上浏览了一些关于Block的文章,自己进行一下消化吸收。
Void (^blockName)(parma)-> Block声明
Void (^) (parma){}; ->Block定义 可省略返回值 ^(parma){};
当Block作为参数传递时 -> (Void (^)(parma))blockName
常用 -> typedef Void (^blockName)(parma);
关于Block一些底层原理。通过 clang -rewrite-objc main.m 命令将OC转换为C++后,了解到Block的一些运作原理。
1. Block分为3种状态 _NSConcreteGlobalBlock,_NSConcreteStackBlock,_NSConcreteMallocBlock,分别为全局的Block、栈上的Block、堆上的Block,ARC模式中,第二种会隐式的将栈上的block拷贝到堆上。
2.关于Block内部使用外部变量的问题。
2.1 局部变量(基础数据类型)类似于值传递,所以在Block内部不能对局部变量修改,类似于函数中的值传递。
局部变量(对象)从.cpp文件中可以看到,在block的结构体中,强引用了局部对象,相当于引用计数+1,所以局部变量不会被销毁。当使用这个局部变量的时候,类似于函数中的指针传递,此时可以通过指针改变局部变量的值。
局部变量被__block修饰的时候,会生成一个__Block_byref_parma_0的结构体。这时候局部变量在block内部改变的时候,相当于也是指针传递,所以外部的值也被修改。(用__block修饰的局部变量还会生成copy和dispose俩个函数,用于管理内存)
局部变量被static 修饰的时候,block结构体中会多出一个*parma的指针,所以在block内部修改被static修饰的局部变量的时候,传递的是指针,也可以影响外部的局部变量。
2.2 全局变量(基础数据类型) 可以进行修改。
实例变量 在Block内部引用实例变量(无论是否使用get方法),block底层会生成一个对该实例变量的一个强引用,如果该实例持有block,会造成循环引用。避免方法用__weak修饰使用的实例变量。
Block学习总结的更多相关文章
- iOS Block学习
iOS4已经直接支持blocks,很有必要学习一下. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其 本身又 ...
- Block学习一门:基本使用,使用block包NSURLRequest异步请求
首先,看一下下面的代码: void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){ NSLog(@"== ...
- block学习二:使用Block替代回调
使用Block替代回调,分为三步进行:
- 黑马程序员_ Objective-c 之block、protocol学习笔记
一):block学习总结 block :用来保存一段代码. 1.block 特点: 1> Block封装了一段代码,可以在任何时候执行 2> Block可以作为函数或者函数的返回值, ...
- iOS 使用Block实现函数回调
事实上.iOS中的Block就是C++中的函数指针,实现方式都是一样的,以下贴出一个简单的实践. 首先,创建一个回调的类 BlockStudy.h // // BlockStudy.h // Bloc ...
- Aspects 源码学习
AOP 面向切面编程,在对于埋点.日志记录等操作来说是一个很好的解决方案.而 Aspects 是一个对于AOP编程的一个优雅的实现,也可以直接借助这个库来使用AOP思想.需要值得注意的是,Aspect ...
- 系列文章--Enterprise Library文章总结
自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋友的支持,在这里一并表示感谢.为了方便大家的阅读,这里我 ...
- monkey测试===ios-monkey测试工具
iOSmonkey测试工具: crashmonkey 特点: 支持**真机测试.模拟器测试** 支持收集**系统日志(Systemlog)**.**崩溃日志(Crashlog)**.***instru ...
- windows 通过cmd命令行管理防火墙
(1)恢复初始防火墙设置 netsh advfirewall reset(2)关闭防火墙 netsh advfirewall set allprofiles state off(3)启用桌面防火墙 n ...
随机推荐
- HDU5542 The Battle of Chibi
题意 给出长度为n的序列,问这个序列中有多少个长度为m的单调递增子序列. \(1\le M\le N\le 1000\) 分析 用F[i,j]表示前j个数构成以Aj为结尾的数列中,长度为i的严格递增子 ...
- bvlc_reference_caffenet网络权值可视化
一.网络结构 models/bvlc_reference_caffenet/deploy.prototxt 二.显示conv1的网络权值 clear; clc; close all; addpath( ...
- Android 的内存泄露和内存限制
转载自 https://blog.csdn.net/goodlixueyong/article/details/40716779 https://blog.csdn.net/vshuang/artic ...
- autoit3编辑器SCITE字体设置
选项→打开全局设置文件,就是SciTEGlobal.properties,修改下面的部分即可,保存之后立刻生效.如果不行,就打开用户设置文件SciTEUser.properties进行修改: font ...
- WampServer的下载方法
http://www.wampserver.com/ 无法访问 报网络连接错误 2019.01.13 最近要用到Windows+apache+mysql+php,为了追求更快的实现速度和更高的稳定性, ...
- 过滤器手动注入Service Bean方法
@Override public void init(FilterConfig arg0) throws ServletException { ServletContext servletContex ...
- Win7系统安装Centos7.0双系统(一)
项目环境测试,过去在虚拟机安装只要配置好镜像很快就可以轻松安装,但是在真实机中安装就有些略坑.网上有很多说法是把iso文件中安装引导拷出来,试了很久还是觉得U盘镜像直接安装更便捷.靠谱.因为CentO ...
- 2.STM32启动文件
一.概念声明 中断向量:由硬件产生的中断标识码,一般用于存放中断服务程序的跳转指令.根据硬件产生的中断号查找中断向量表来确定对应的中断向量.CM3内核有15个异常 和240个中断源. 程序的内 ...
- Python Day5 模块 包
一:区分Python文件的2种用途 1个Python文件的2种用途 1.1 当作脚本执行: if __name__ == '__main__': 1.2 当作模块导入使用 if ...
- iOS上传本地代码到git
1.顾名思义,首先你得注册一个github账户 这个我就不细说了. 2.然后你得创建一个 repository 步骤见下图 3.相当于创建成功 会跳到下图界面 4.一看就很清楚了 create a ...