block语法

#import <Foundation/Foundation.h>

#import "QFDownloadBlock.h"


int add(int a,int b)

{

    return a + b ;

    

    

}



//c语言中函数名称可以作为函数的常量指针,表示函数的代码内存首地址

int add2(int a,int b)

{

    return (a + b)*2 ;

    

    

}


//定义一个函数指针,指针可以指向函数的首地址,函数地址(函数名)的定义有两个int参数 并且返回值为int,函数指针是有类型定义的

int (*pFunAdd) (int a,int b);



//无返回值和参数的函数指针

void (*pFun)(void);


//定义一个block对象,用来存储函数的代码块(代码片段),内部实现也使用c的指针的方式来存储函数指针,比c语言的函数指针更加复杂,block是有内存生命周期的,内存的管理是由oc的一套特殊的管理机制来负责管理的

int (^blockAdd)(int a, int b);



//定义函数对象2

void(^blockFun)(void);





int main(int argc, const char * argv[])

{


    @autoreleasepool {

        

        int k = add(5, 6);

        

        int j = add2(7, 8);

        

        pFunAdd = add;

       int m =  pFunAdd(5,6);

        

        pFunAdd = add2;

        

        int n = pFunAdd(7,8);

        

        

        //声明一个函数的代码片段,并实现函数体,将函数的代码片段赋值给block对象,函数定义是有返回值的

        blockAdd = ^int(int a,int b)

        {

            return a+b;

            

            

        };

        

        

        int t = blockAdd(5,6);

        

        

        //无参数无返回值的block定义

        //内部可以声明临时变量,并且可以对临时变量进行任何操作

        int blockMember = 10;

        

        //block函数代码片段可以使用外部定义的变量的值,不能改变外部普通变量的值

        //定义一个可以在block中赋值的变量

        //会在block中对此空间进行内存的锁定

        //block的生命周期没有结束时,_block定义的变量也不能释放内存

        

       // _block  int blockChange = 20;

       // blockChange = 40;

        

        

        blockFun = ^(void)

        {

            NSLog(@"1111");

            int a =10;

            int b = 20;

            int c = a+b;

            NSLog(@"c= %d",c);

            NSLog(@"bMember = %d",blockMember);

            

            

        };

        

        //block的对象使用,与函数指针相同

        //

        

        blockFun();

        

        

        

        //定义一个block对象

        //block对象也称作无名称对象

        

        int (^blockNew)(void)= ^int (void)

        {

            return 10*10;

            

        };

        

        blockNew();

        

        QFDownloadBlock *download = [[QFDownloadBlock alloc]init];

        

        [download startDownload:

         ^(NSString *strState, NSData *data)

        {

            

            //数据解析

            NSLog(@"stata = %@",strState);

            

            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

            

            NSLog(@"dic = %@",dic

                  );

            

            

            

        }

         strURL:@"www.baidu.com"

         ];

        

        

    }

    return 0;

}

#import <Foundation/Foundation.h>


//定义一种block类型

//类型的返回值为void,并且带有两个参数

typedef void(^returnBlock) (NSString *strURL,NSData *data) ;

@interface QFDownloadBlock : NSObject

<NSURLConnectionDataDelegate,NSURLConnectionDelegate>

{

    

   __block NSMutableData *_data;

    

    NSURLConnection *_connection;

    

    

    //定义以一个block对象

    returnBlock _resultReturn;

    

    

    

    

}



//定义一个启动下载函数,函数的参数是block对象,block是用于回传数据使用的参数,传入的参数方法一

-(void)startDownload:(returnBlock)block strURL:(NSString*)strURL;




//直接在参数中定义一个block对象作为参数,方法2

-(void)startDBlock:(void(^)(NSString *strURL,NSData *data))block;











@end


#import "QFDownloadBlock.h"


@implementation QFDownloadBlock

-(void)startDownload:(returnBlock)block strURL:(NSString*)strURL;

{

    _resultReturn = block;

    

    NSURL *url = [NSURL URLWithString:strURL];

    

    

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    

    

    

    

    

    

}



-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    [_data appendData:data];

    

}



-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    

}



-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    

    NSString *str = @"下载成功";

    

    

    //使用block对象,将数据回传给主控制对象

    _resultReturn(str,_data);

    

    

    

    

    

}







@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值