block的基本用法

 [block]:代码块,闭包;代码块是对一段代码的封装,代码块可以作为一个变量使用,类似于函数指针变量,可以作为函数的参数来进行传递,也可以直接在代码中匿名实现.

 block的定义和实现类似函数的声明和实现。


        

        

#pragma mark - 1

        //block的内部可以读取外部的局部变量,但是不能修改,要修改需要加上__block声明

        int c = 2 ;

        __block int c2 = 1 ;//block可以修改的局部变量,不适用___block是无法修改c的(不加,在block内部是只读的)

        int (^myBlocks)(int ,int); //声明一个block  在下面进行实现

        myBlocks = ^(int m ,int n){

            NSLog(@"%i %i",m,n);

            return m*n;

        };//block看成一个变量

         //调用block

        int r = myBlocks(7,8);

        NSLog(@"——————————————%i",r);

#pragma mark - 定义一个空的 block

        //block是一个数据类型

        //定义一个名字为block的变量 相当于 void(^)(void) block ;

        void(^block)(void);

        //block可以保存一个代码块

        //返回类型为void的代码块,返回类型体现在代码块的return

        block = ^(void){

            NSLog(@"hello");

        };

        NSLog(@"____________________");

        block();

        NSLog(@"____________________");

        

#pragma mark -定义了一个返回值为int,有两个参数的block变量

        int (^block2)(int ,int);

        block2 = ^(int a, int b){

            return a+b;

        };

        NSLog(@"%d",block2(8,9));

        //打印说明block'是一个对象,也需要遵循内存管理,对于block来说,我们要进行copy

        NSLog(@"%@",block2);


        int (^block3)(int,int) = [block2 copy];

        NSLog(@"%@",block3);

//        [block3 release];

//        也可以用系统提供的宏进行拷贝

//        int (^block4)(int ,int) = Block_copy(block2);

        

        __block NSString *str = @"hello";

        NSString *str1 = @"world";

        NSString *(^block5)(NSString *,NSString *);

        block5 = ^(NSString *s ,NSString *r){

            //注意,只能读取不能修改  ,如果想要修改,要用__block声明

            str = @"bsbbbsb";

            NSLog(@"str  = %@",str);

            NSLog(@"str1 = %@",str1);

            

            return [s stringByAppendingString:r];

        };

        NSLog(@"%@",block5(str,@"_1hello"));

        NSLog(@"str  = %@",str);

        

        

#pragma mark - dog类

        Dog *dog = [[Dog alloc]init];

        dog.dogBlock = ^(int count){

            for (int i = 0; i < count; i++) {

                NSLog(@"旺旺");

            }

        };

        [dog closeDoor];

        

     

        

        [dog dogEat:5 complation:^(int num) {

            NSLog(@"哈哈哈 num = %d",num);

        }];





#import <Foundation/Foundation.h>


//定义了一个block类型 ,,名字为dogBark,返回类型为void有一个int类型的参数的block

typedef  void(^DogBlock)(int num) ;


@interface Dog : NSObject


@property(nonatomic,copy) DogBlock dogBlock;



- (void)closeDoor ;

- (void)dogEat:(int)num complation:(DogBlock)dogBk;


@end



#import "Dog.h"


@implementation Dog



- (void)closeDoor{

    if (_dogBlock) {

        _dogBlock(arc4random()%10+1);

    }

}



- (void)dogEat:(int)num complation:(DogBlock)dogBk{

    //传入参数

    

    NSLog(@"....dog 吃完了 %d 食物",num);

    if (dogBk) {

        dogBk(1000);

    }

}


@end



        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值