iOS开发--Block使用有坑

作者: 爱吃鱼的小灰 | 来源:发表于2016-11-16 15:49 被阅读1373次

首先来了解下什么是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使用有坑

    本文链接:https://www.haomeiwen.com/subject/fwdrpttx.html