block的简单使用

一、block

代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)
结论:
(1)在类中,定义一个Block变量,就像定义一个函数;
(2)Block可以定义在方法内部,也可以定义在方法外部;
(3)只有调用Block时候,才会执行其{}体内的代码;
(PS:关于第(2)条,定义在方法外部的Block,其实就是文件级别的全局变量)
那么在类中定义一个Block,特别是在-viewDidLoad方法体内定义一个Block到底有什么意义呢?这时候只把它当做私有函数就可以了。Block其实就相当于代理,那么这时候该怎样将其与代理类比以了解呢。这时候可以这样说:本类中的Block就相当于类自己服从某个协议,然后让自己代理自己去做某个事情。本类中定义的一个Block其实就是闲的蛋疼,委托自己去字做某件事情,实际的意义不大,所以你很少看见别人的代码直接在类中定义Block然后使用的,Block很多的用处是跨越两个类来使用的,比如作为property属性或者作为方法的参数,这样就能跨越两个类了。 
block在使用的过程中可能会产生循环引用:1、为什么?-- 因为block当时带定义的时候相当于使用的是setter方法,而且语义设置用的是copy 如果在内部使用self或者是self相关属性、实例变量等都会对他们的引用计数加1 2、怎么解决?为了防止循环引用,会在使用之前定义一个新的指针变量指向self,而且是弱引用即__block
二、block使用步骤:
#warning 1、重定义一个block
typedef void(^PassvalueBlock)(NSString *value);
#warning 2、设置属性(在将block定义成属性的时候需要将其进行copy,因为定义的block本身是在全局区或者是栈区,为了能够管理block需要将它拷贝到堆区,有程序员自己管理)
@property(nonatomic, copy)PassvalueBlock passvalue;
#warning 3. block的定义
    __block FirstViewController *Text = self;
    secondVC.
passvalue = ^void(NSString *value){
    UILabel *label = [Text.view.subviews objectAtIndex:0];
         label.text  = value;};
#warning 4.block的调用
    if (self.passvalue != nil) {
        self.passvalue(@" textField.text");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值