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 ...
随机推荐
- 《DSP using MATLAB》Problem 7.5
- angular 使用window事件
1. 使用host 2. 使用HostListener 推荐使用第二种方式. 不推荐下面的方法,虽然也能进行window事件的绑定,但组件销毁后,window事件任然保留,即使手动在组件的ngOn ...
- Python数据存储:pickle模块的使用讲解
在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间.Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象 ...
- oracle-taf
http://blog.sina.com.cn/s/blog_48567d850102wck0.html配置目标:把RAC系统配置为“主-备”模式,即平时所有连接都在rac01这个节点上,当rac01 ...
- Fabric的settings用法
http://fabric-chs.readthedocs.io/zh_CN/chs/api/core/context_managers.html?highlight=with%20settings# ...
- QT QHttpMultiPart上传图片
使用get请求或post请求可以传递简单的参数,但要上传图片到服务器,就要多做一些工作了,如下代码片段利用post请求可成功上传图片到服务器: QNetworkRequest request; req ...
- mig_7series_v4_0_data_gen_chk
mig_7series_v4_0_data_gen_chk `timescale 1ns / 1ps ///////////////////////////////////////////////// ...
- C语言----管道
一.管道的概念 管道是一种队列类型的数据结构,它的数据从一端输入,另一端输出.管道最常见的应用是连接两个进程的输入输出,即把一个进程的输出编程另一个进程的输入.shell中存在专门的管道运算符&quo ...
- node压缩文件夹
前几天遇到一个需求,将一个10G的文件夹打包压缩,并去除黑名单上的文件. node自带的只能压缩文件.网上看了集中方案要么对大文件操作不行,要么只能直接操作文件夹,无法对文件夹遍历筛选. 后来确定使用 ...
- Hash和HashCode深入理解
目录介绍1.Hash的作用介绍1.1 Hash的定义1.2 Hash函数特性1.3 Hash的使用场景2.如何判断两个对象相等2.1 判断两个字符串2.2 判断两个int数值2.3 其他基本类型3.H ...