OC学习--Block

来源:互联网 发布:mac电源适配器坏了 编辑:程序博客网 时间:2024/05/16 19:06

=====Block=========


block就是代码块,可以可以理解为没有名字的函数(匿名函数)。

定义:

 (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用

 (2)^是Block特有的标记

 (3)Block的实现代码是包含在{}中的

 (4)使用形式类似于前面学习的函数指针,只需将“*”改为“^”。

 (5)可以将Block当做比较特殊的对象

—————- ———— —— — — — - - — — -

什么是函数指针?

函数指针就是指向函数的指针!

如:实例代码

 

       int add(int a,int b)

        {

           return a+b;

        }


       int (*p)(int,int)=add;//指针函数


Block函数例子


(1)无参无返回值block

        //格式:^返回值类型(参数)

       void (^block1)(void) = ^void(void) {

            NSLog(@"我是无参无返回值的block");//代码实现

        };

        //调用block

        block1();

(2)有参数有返回值(其中返回值的类型是可以省略的 )

//有参数有返回值

       int (^block2)(int,int) = ^int(int a,int b) {

           return a+b;

        };

int (^block2)(int,int) = ^(int a, int b) {//省略返回值类型

           return a+b;

        };

 (3) block函数做为参数传递

@interface JYDog : NSObject


-(void)testBlock:(void (^)(void))block;//定义一个具有block类型参数的函数



- (int)testBlock2:(int (^)(int,int,int))block;



@implementation JYDog


- (void)testBlock:(void (^)(void))block//实现

{

    NSLog(@"执行 testblock");

    block();

}


- (int)testBlock2:(int (^)(int,int, int))block//实现

{

   return block(1,2,3);

}


@end


=====main=====

 

       void (^block1)(void) = ^(void) {

           NSLog(@"今天天气很凉爽");

        };

       JYDog *dog = [[JYDogalloc] init];

        [dogtestBlock:block1];


        //可以直接在调用时创建block

       int avg = [dog testBlock2:^int(int a,int b, int c) {

           return (a+b+c)/3;

        }];

       NSLog(@"1,2,3的平均值为:%d", avg);


       04F08754-5A7D-4B5B-88CA-E2AD13CC4EDE.png

(4 )使用typedef(参数过多的时候可以选择使用typedef)


#import <Foundation/Foundation.h>

typedef void (^BLOCK)(void);

typedef int (^BLOCK1)(int,int,int);


@interface JYDog : NSObject


- (void)testBlock:(BLOCK)block;

- (int)testBlock2:(BLOCK1)block;



@implementation JYDog


- (void)testBlock:(void (^)(void))block//实现

{

    NSLog(@"执行 testblock");

    block();

}


- (int)testBlock2:(int (^)(int,int, int))block//实现

{

   return block(1,2,3);

}


@end



=====main=======

 BLOCK block1 = ^(void) {

           NSLog(@"今天天气很凉爽");

        };

        

       BLOCK1 block2 = ^int(int a,int b,int c) {

           return (a+b+c)/3;

        };

        

       JYDog *dog = [[JYDogalloc] init];

        [dogtestBlock:block1];


        //可以直接在调用时创建block

       int avg = [dog testBlock2:block2];

       NSLog(@"1,2,3的平均值为:%d", avg);

        


(5) block的拷贝

  //返回值可以省略

       BLOCK block = ^(int a,int b){

           return a+b;

        };

       NSLog(@"%p", block);

        

        //block可以像对象一样

       BLOCK newBlock = [block copy];

       NSLog(@"%p", block);

       NSLog(@“%”p, newBlock);//指向的地址是同一个地址

        //拷贝出来的block需要释放

        [newBlockrelease];

        

        //C语言中的block拷贝与释放

       BLOCK block2 = Block_copy(block);

       Block_release(block2);


(6)Block的局部变量

        |~   可以使用局部变量。但是不能修改局部变量,若想修改局部变量需要添加__block修饰

        |~ 可以使用全局变量



====Block在iOS中使用场景====

a.数组排序

 

        NSMutableArray *mAry = [[NSMutableArrayalloc] initWithArray:@[@"abc",@"xiaoming",@"ios",@"swift",@"good"]];


 NSComparator block = ^NSComparisonResult(id obj1,id obj2) {

           return [obj1 compare:obj2]==NSOrderedDescending;

        };

 NSArray *newAry = [mAry sortedArrayUsingComparator:block];


b.遍历数组或者字典

c.通知

d.错误处理

e.多线程





0 0
原创粉丝点击