iOS开发--Block使用有坑

首先来了解下什么是Block

  • (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用

    (2)^是Block的特有标记

    (3)Block的实现代码包含在{}之间

    (4)大多情况下,以内联inline函数的方式被定义和使用

    (5)Block与C语言的函数指针有些相似,但使用起来更加灵活

  • 示例:

  void(^demoBlock)() =^ {
   NSLog(@"Block");
// 无参数,无返回值
};
int(^sumBlock)(int, int) =^(int x, int y) {
   return x +y;
// 有参数有返回值
};
  • 格式说明:(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};

    如果没有参数,等号后面参数列表的()可以省略

  • 注意事项:
    1、Block可以使用在定义之前声明的变量

int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
} 
i = 100;
myBlock();
  • 注意:
    1、在定义Block时,会在Block中建立当前局部变量内容的副本【也就是拷贝】。
    2、后续再对该变量的数值修改,不会影响Block中的值,所以上述代码执行结果是10.
    3、如果想要在Block中保持局部数值的变化,需要用到__block关键字
__block int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
} 
i = 100;
myBlock();

Block的使用要点

1、Block可以被当做参数直接传递​,在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量

  • ​注意:默认情况下,Block外部的变量,在Block中是只读的!
    2、​如果要修改Block之外的局部变量,需要使用__block关键字,一般用不到__block关键字,在块代码中可以修改成员变量的数值(比较少用)
    3、当把一个对象传递进Block的时Block会自动对对象的指针做强引用
    4、用typedef定义一个Block的类型,便于在后续直接使用
typedef double(^MyBlock)(double, double);
// 下边直接用定义的名字写起来简短许多
MyBlock area = ^(double x, double y) {
    return x * y;
};
MyBlock sum = ^(double a, double b) {
    return a + b;
};​

(1)typedef是关键字用于定义类型,MyBlock是定义的Block类型
(2)area、sum分别是MyBlock类型的两个Block变量尽管,typedef可以简化Block的定义,但在实际开发中并不会频繁使用typedef关键字
这是因为Block具有非常强的灵活性,尤其在以参数传递时,使用Block的目的就是为了立即使用

  • 关于Block的循环引用问题
@property (nonatomic,strong)NSMutableArray * myBlocks;
#pragma mark 
int (^sum)(int ,int) = ^(int x,int y){
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
代码导图.jpg
  • 解决循环引用的办法


    代码导图.jpg
  • 下一篇文章将介绍如何把按钮的点击事件用Block传递出去
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 2,403评论 2 26
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 755评论 2 1
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,795评论 0 23
  • 转自李峰峰博客 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」...
    Joshua520阅读 1,043评论 0 0
  • 应用正常运行的过程中,切后台进入设置页关闭应用部分权限(注:关闭包含先打开再关闭,也就是说有关闭操作),再从多窗口...
    秒速V厘米阅读 1,221评论 0 1