博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中Block介绍 基础
阅读量:7203 次
发布时间:2019-06-29

本文共 1606 字,大约阅读时间需要 5 分钟。

ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。讨论范围:block的使用,内存管理,内部实现。不包含的内容:gc arc下的block内存,block在c++中的使用。

AD:

一、概述

Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

二、热身

先看一个比较简单的Block例子:

  1. int multiplier = 7; 
  2. int (^myBlock)(int) = ^(int num) { 
  3.     return num * multiplier; 
  4. }; 

在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

来,让我们typedef一下

  1. typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block 
  2. typedef int (^IntBlock)(void);//一个没有参数,返回int的block 
  3. typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block 

三、更详细的例子

注意:上面的typedef都还有效~

主动调用一下:

  1. - (void)someMethod 
  2.     BoolBlock ablock = ^(BOOL bValue) { 
  3.         NSLog(@"Bool block!"); 
  4.     }; 
  5.     ablock(); 

作为参数返回:

  1. typedef void (^BoolBlock)(BOOL); 
  2. - (BoolBlock)foo() 
  3.     BoolBlock ablock = ^(BOOL bValue) { 
  4.         NSLog(@"Bool block!"); 
  5.     }; 
  6.     return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解 

类的一个成员:

  1. @interface OBJ1 : NSObject 
  2. @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们 
  3. @end 
  4.  
  5. OBJ1 *obj1 = ... 
  6. obj1.block = ^(BOOL bValue) { 
  7.         NSLog(@"Bool block!"); 
  8.     }; 

其他函数的参数:

  1. - (void)foo(BoolBlock block) 
  2.     if (block) { 
  3.         block(); 
  4.     } 

甚至其他block的参数:

  1. BoolBlock bBlock = ^(BOOL bV){
    if(Bv){
    /*do some thing*/}}; 
  2. HugeBlock hBlock = ^(BoolBlock bB) {bB();}; 
  3.  
  4. hBolck(bBlock); 

啊,全局变量!:

  1. static int(^maxIntBlock)(int, int) = ^(int a, int b){
    return a>b?a:b;}; 
  2. int main() 
  3.     printf("%d\n", maxIntBlock(2,10));   
  4.     return 0; 

好了,你知道block大概能怎么用了。

四,特殊的标记,__block

如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

  1. int main() 
  2.     __block int i = 1024; 
  3.     BoolBlock bBlock = ^(BOOL bV) { 
  4.         if (bV) { 
  5.             i++;//如果没有__block标记,是无法通过编译的。 
  6.         } 
  7.     }; 
  8. }

转载地址:http://zrwum.baihongyu.com/

你可能感兴趣的文章
View requires API level 14 (current min is 8)
查看>>
flannel集群安装
查看>>
android 的viewpager如何实现左右循环
查看>>
易宝典文章——玩转Office 365中的Exchange Online服务 之二十三 实现基于IP地址的邮件过滤...
查看>>
Anychat即时通讯系统
查看>>
2011年 小结
查看>>
手机网站的网页进行微信转发时遇到的问题
查看>>
在RHEL6上配置基于ftp的YUM
查看>>
【行为型】- 状态模式
查看>>
AIX5.3 hacmp配置
查看>>
Linux关闭休眠和屏保模式
查看>>
我的友情链接
查看>>
笨笨的我---终于完成了vim下php IDE的配置
查看>>
php---window 7 配置memcached并测试成功
查看>>
用MyEclipse做Junit测试时报错
查看>>
sed批量替换文件内容
查看>>
linux基础命令学习之mkdir(3)
查看>>
ELK体系大型日志分析集群方案设计.搭建.调优.管理
查看>>
cacti监控工具之自定数据收集方法
查看>>
面试感悟----一名3年工作经验的程序员应该具备的技能
查看>>