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 ...
随机推荐
- SQL 入门了解
SQL 随着应用程序的功能越来越复杂,数据量越来越大,如何管理这些数据就成了大问题: 读写文件并解析出数据需要大量重复代码: 从成千上万的数据中快速查询出指定数据需要复杂的逻辑. 如果每个应用程序都各 ...
- PythonStudy1——Python 值拷贝 浅拷贝 深拷贝
拷贝:对值进行复制的过程 # 值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来 # ls内部的值发生任何变化,ls1都会随 ...
- java_注解
注解1 注解的概念 jdk自带的注解 声明与使用注解的基本语法 注解的概念 在javaEE与开源框架中广泛使用,泛型在集合框架中广泛使用 注 ...
- 第十一章 IO流
11.IO流 11.1 java.io.File类的使用 1课时 11.2 IO原理及流的分类 1课时 11.3 节点流(或文件流) 1课时 11.4 缓冲流 1课时 11.5 转换流 1课时 11. ...
- python制作模块
自己写的函数,为了下一次方便用,做成模块 主要有这几个步骤: 1:准备发布 2:构建发布 3:导入模块并使用 1:准备发布 首先,我自己写的一个打印出列表(含嵌套列表),打印出列表中的每个数据项,文件 ...
- redis.conf 配置信息:读取及修改命令
相关资源 网址 官方地址(网页中 Command + F,输入井号"#",方便查看没有注释的行) http://download.redis.io/redis-stable/red ...
- lvm基本管理
LVM简介 LVM (logical volume manager)逻辑卷管理的简写,可以动态增加或减小逻辑卷的大小. 术语介绍 物理存储介质(Physical Storage Media) 通常指硬 ...
- 量化分析v1
量化分析v1 # -*- coding: utf-8 -*- """ Created on Wed Apr 11 10:13:32 2018 @author: chens ...
- [UE4]瞬移
1.设置Input,事件名称设置为Teleport 2.设置事件Teleport 3.
- 配置iis支持json解析,配置ssi
配置json解析: 添加mime:*.json 类型 text/json 安装iis应用程序开发中的asp功能 添加处理程序映射: 添加脚本映射 请求路径:*.json 可执行文件:C:\Windo ...