A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 用晦而明 中级黑马   /  2015-8-10 20:03  /  720 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

block的基本概念


Block对象是一个C级别的语法和运行机制
Block对象包含着一组状态数据,程序运行时产生影响。


可用Block来写一些可以传到API的函数语句,可选择性地存储。
并可以使用多线程。作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间的需要的数据。


block同时兼容c oc c++


block基本用法


int (^myBlock)(int)=^(int num){};
第一个int表示返回值
第二个int表示参数类型
第三个int后表示参数名字
{}快对象的主体部分。


void(^myBlock4)()=^(){};
使用Block变量
myBlock4)();
优化之后
函数指针别名


typedef int (*NewType)(int x,int y);
NewType f1,f2,f3;


block 的typedef


格式:type 返回值类型(^block变量名是新别名)(参数类型列表);


typedef int ^(Block)(int,int);
Block  b1;   //Block 是一个类型




block访问外部变量


block内部可以访问block外部的变量将外部变量的值以const方式拷贝一份到block所在的内存中  一个新的内存空间变量




block内部
不允许修改外部的变量


__block int m =10; //栈区地址


void(^myBlock)()=^{
m=100; //__block不再以const的方式拷贝,允许修改  修改的还是copy后block空间内部的变量




};
%d%p,m,&m
block运行后m的地址和值是在block更改之后的值和地址。






静态变量和全局变量 在加不加__block都会直接引用变量地址,也就意味着可以修改变量的值,在没有加__block参数的情况下。
堆 block 是对block copy得来,对全局block copy不会有任何作用返回的依然是全局block
全局block 定义在函数外面的block是global的;另外如果函数内部的block,但是没有捕获任何自动变量,那么他也是全局的。
栈block 区别为是否引用了外部变量






常量变量————不加__block类型block会引用常量的地址(浅copy)加__block类型block会去引用常量变量的地址。  










block应用场景


void work (void (^workBlock())//block类型的变量workblock作为函数的参数
{






}


typedef void (^workBlock)();
workBlock w;
w=^{
NSLog(@"sdffdsfsf");
}




作为函数返回值


workBlock test(){


}




block使用技巧和注意


1.block助记符
inlineblock 快捷创建block




点击xcode右下角{}按钮
之后将你想快捷的代码选中之后往{}下的区域拖拽
编辑Completion shortcut  也就是助记符字母






之后将 类型选中 改成<#type#> 变量名 改成<#name#>


删除选中助记符 按delete键




2.我们在定义block变量的时候,形参类型及个数 这个位置处可以
加上形参名称


void test (int(^block)(int x,int y)){


}


test之后回车就会自动填充两个变量 xy

void(^myBlock4)()=^{};

2 个回复

倒序浏览
牛,6666.。。。
回复 使用道具 举报

感谢你的关注!~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马