#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