OC特有语法—Block

来源:互联网 发布:淘宝客怎样推广店铺 编辑:程序博客网 时间:2024/04/28 22:58

Block:

 与函数指针的比较:

有点像函数指针,可以作为参数传递,作为函数返回值

函数指针:

Void *mypoint)()=test  //指向函数的指针。存储函数名代表的指针变量

mypoint();

block弥补了 指向函数的指针不能够直接保存一个函数体

void ^myBlock()=^{

    NSLog@“test”);

}



(1)定义BLOCK变量

Int (^SumBlock)(int,int);//有参数,返回值类型为int

Void (^MyBlock)()//无参数,返回值类型为空

(2)利用block封装代码

  

(3)Block访问外部变量

1)Block内部可以访问外部变量;

2)默认情况下,Block内部不能修改外部的局部变量

3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。

 

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

Typedef int(^MyBlock)(int ,int);

1)定义block变量:

MyBlock a,b;  

a=^(int a,int b){return a-b;};

MyBlock b2=^(int n1,int n2){return n1*n2;}

2)作为参数传递:

-(int)calculateWithNumber1:(int)number1 andNumber2:(int)number2

andCalculateBlock:(MyBlock )calculate

{

         return calculate(number1,number2);

}


  (3)作为属性:

@property (nonatomic, copy) void (^testBlock)();  


    // 1.如果没有对block进行copy操作,block就存储于栈空间
    // 2.如果对block进行copy操作,block就存储于堆空间
    
    // 3.如果block存储于栈空间,不会对block内部所用到的对象产生强引用
    // 4.如果block存储于堆空间,就会对block内部所用到的对象产生强引用

 LPerson *p =[[LPerson alloc] init];

//解决办法:

_weak typeof (p) weakP = p;


p.testBlock = ^{

[p run]

}     


非ARC:

__block typeof(p) weakP = p;
//    p.testBlock = ^{
//        [weakP run];
//    };


即:

Block的使用注意:

1>   block的内存管理

2>   防止循环retian

l  非ARC(MRC):__block

l  ARC:__weak\__unsafe_unretained



     int age = 10;
    void (^block)() = ^{ // 值捕获
        NSLog(@"age=%d", age);
    };
    
    age = 20;     

打印10.               __block int age = 10;(可以在block改值,动态取age的值,相当于NSLog(@"age=%d",*&(age)),传的是地址)  打印20  static int age = 10;  打印20



0 0