ios中的block

作者: 快乐的tomato | 来源:发表于2017-06-22 18:06 被阅读66次

一、what

Block类型是一个C级别的语法和运行机制,他与标准的c函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响
你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程。作为一个回调,block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
由于OC和C++都是衍生自C,block被设计为可同时兼容这三种语言。

二、block的基本使用

2.1 block的形式

结构形式.png
  • 无参无返回值
//定义一个block
void (^myblock1)()=^(){

  NSLog(@"myblock1");

};
//使用block
myblock1();
  • 无参有返回值
int (^myblock2)()=^(){

return 8;
  NSLog(@"myblock2");

};

myblock2();
  • 有参无返回值
void (^myblock3)(int,int)=^(int a, int b){
  NSLog(@"%d",a+b);
};

myblock3(3,7);

//也可以先定义变量,再赋值
myblock3 =^(int x,int y){
      NSLog(@"%d",x-y);
};

myblock3(8,7);
  • 有参有返回值
int (^myblock4)(int,int)=^(int a, int b){

  NSLog(@"%d",a+b);

  return a + b;
};
int sum = myblock4(3,4);
NSLog(@"%d",sum);

三、block的typedef

利用typedef定义block类型(和指向函数的指针很像)

  • 格式
    typedef 返回值类型 (^新别名)(参数类型列表);
    typedef int (^myblock)(int , int);

以后就可以利用这种类型来定义block变量了;

typedef void (^Block)();
Block b1;
//Block类型的变量
b1 = ^{
     NSLog(@"myblock");
};

//有参数有返回值
typedef int (^newType)(int , int);
newType nt1 = ^(int a, int b){
   
retutn a +b;
};
int s = nt1 (12 , 23);
NSLog(@"%d",s);

//联系定义多个newType的变量
newType n1,n2,n3
n1 = ^(int x, int y){
   
retutn x*y;
};

四、block访问外部变量

在block内部可以访问block外部变量,但是注意,这是一个新的内存空间变量。

代码:

Paste_Image.png

运行结果:


Paste_Image.png

内部以const的方式copy外部的变量来访问。

如果要修改外部的变量,需要加__block,如下图,不过修改的还是copy过来的变量。


又有另外一种情况
代码:



打印结果


Paste_Image.png

6和7的结果是100,不是10,说明是堆区的变量

相关文章

网友评论

    本文标题:ios中的block

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