Blocks

来源:互联网 发布:淘宝二手电脑市场 编辑:程序博客网 时间:2024/04/30 12:39
1.在需要传递信息的viewcontroller里面声明blocks变量

在需要传递信息的ViewController里边声明blocks变量。

如下:

void (^blocks) (int flag, NSString * string);   // 变量名为blocks  ,, 后边的两个变量为需要传递的信息
void (^blocks2) (SecendViewController * sec);  // 变量名为blocks2

并添加一个  -(void) setBookName :(void (^) (SecendViewController * sec))name; 方法

void (^) (SecendViewController * sec)我理解的是可以当做一个一般的类型,比如NSString来看待

在.m文件里边

-(void) setBookName :(void (^) (SecendViewController * sec))name
{
    [blocks2 release];   // 这里边也是符合内存管理的
    blocks2 = [name copy];
}

在需要推出次界面的的方法里边:

if (blocks2) {

        blocks2(self);   // 我理解的是就如同一个普通的函数一样,在此时去回调blocks2也就是上边name的方法块(方法块在需要接受信息的controller里边)
}


在接收的ViewController里边,可以再推进到第二个界面的时候用创建的对象去调用setBookName :方法

SecendViewController * secendVC = [[SecendViewController alloc]init];

[secendVC setBookName:^(SecendViewController *sec) {
        // name 方法块
    }];   // 这样就把第二个界面的对象传递了过了,也就传递了该对象的所有属性


1.什么是block
是C level的语法以及运行时的一个特性,基于C语言。节省代码,运行效率快。
保存在堆里,也遵循内存管理规则
语法规则:int (^ BFunc) (int   a)
            返回值类型          参数类型
调用:int  ret=BFunc(100)
关键字:_ _ block:
eg1. :
    void (^myBlock) (void)=NULL;
    myBlock=^(){ NSlog”@我是Block”};//赋值
    myBlock();//调用
eg2:带有返回值
     int (^myBlock)(int a ,int b)=^(int a,int b)
     {
      return a+b;
      };//方法定义
      int c=myBlock(3,4);//传值
      NSlog(@“c=%d”,c);
eg3:
_ _block int  sun=0;
int (^myBlock2)(int a ,int b)=^(int a,int b)
{
   sum=a+b;//会报错,当在BLOCK中要修改值的时候要是用_ _ block,避免野指针
};//分号不能少
myBlock2(6,7);
NSlog(@“%d”,sum);
eg4:
typedef void(^Block1)(void);//用typedef定义
  //调用
  Block1 myblock3= ^int (void)//加不加int 没有关系
{
   NSlog(@“myblock3”);
   return 2;//return 不能忘
};
myblock3();
blokc必须要调用!
0 0
原创粉丝点击