ios block

ios block 专栏收录该内容
1 篇文章 0 订阅

block 被Object-C看成一个对象,它封装了一段代码,这段代码可以在任何时候执行,提高程序的阅读性和复用性,相当于C语言中的指针,是一种方法回调机制。是对C语言的扩展,用来实现匿名内部函数的特性,可以实现函数的嵌套,访问函数内部变量。
在类中定义一个block变量,就像定义一个函数。block定义在函数内部,可以把它当作私有函数,定义在函数外部,其实就是文件级别的全局变量 。

Block 可以作为函数参数或者函数返回值,而其本身也可以带输入参数或返回值。

普通定义语法
int (^myBlock)(int a,int b)=^(int a,int b){
  return a+b;
};
调用
int c=myBlock(3,4);


它对局部变量是只读的,不可以修改,只有添加__block 或 static 修饰,才可以修改

int a=10;
void (^myBlock)(int)=^(int num)
{
a=11;//not work
};
此处不能修改是在编译期间确定,编译器在编译时把a 的值复制到block中作为一个新的变量,这时就是函数中的值传递,此时如果修改就要添加 __block 或者 static


对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1

NSString *_string;

_block = ^(){

NSLog(@string %@, _string);

};

这里的_string相当于是self->_string;那么block是会对内部的对象进行一次retain。也就是说,self会被retain一次。当self释放的时候,需要block释放后才会对self进行释放,但是block的释放又需要等self的dealloc中才会释放。如此一来变形成了循环引用,导致内存泄露。

修改方案

__block ViewController *controller = self;

_block = ^(){

NSLog(@string %@, controller->_string);

};


block 作为函数参数的使用


typedef  void  (^MyBlock)(NSString *showTest)//定义block 类型,名字为myBlock

@property(nonatomic,copy)MyBlock  mblock; //属性

-(void)returnTest:(MyBlock)block;//block  作为参数使用


下面一个简单的传值操作

.h 文件定义

typedefvoid (^myBlock)(int a,int b,int c,int d);


@interface ViewController :UIViewController


-(void)loadFinished:(myBlock)block value1:(int)x value2:(int)y;


@property (strong,nonatomic)myBlock myblock;

@end




.m 文件函数实现部分

-(void)loadFinished:(myBlock)block value1:(int)x value2:(int)y;

{

    self.myblock = [blockcopy];

    self.myblock(x+y,x-y,x*y,x/y);

}


此为调用部分

self.m_viewctrl = [[ViewControlleralloc] init];


    //两种 方法实现block

//    void (^myBlock)(int a,int b,int c,int d)=^(int a,int b,int c,int d)

//    {

//        NSLog(@"\n a = 3\n b = 2\n那么: \n a+b = %d \n a-b = %d \n a*b = %d\n a/b = %d\n",a,b,c,d);

//    };

-------------

    myBlock mblock=^(int a,int b,int c,int d)

    {

        NSLog(@"\n a = 3\n b = 2\n那么: \n a+b = %d \n a-b = %d \n a*b = %d\n a/b = %d\n",a,b,c,d);

    };

    [self.m_viewctrlloadFinished:mblock value1:3value2:2];

    







  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值