从使用到了解block底层原理(-)

技术成长之路

Posted by DM on November 27, 2019

1.概述

block : Object - C对于闭包的实现 . 闭包 = 一个函数(或是指向函数的指针) +该函数执行的外部的上下文变量(自由变量)

2.对block的理解

可以嵌套定义,定义 block 方法和定义函数方法相似 block可以定义在方法外部内部或外部 只有调用block时候 才会执行 { } 内的代码 本质是对象,使代码高聚合

3.block的使用方法

(1)无参数无返回值

void (^myBlock)();
myBlock = ^( ) {
NSLog(@"1111111");
};
myBlock();

(2)有参数无返回值

void (^myBlock)(NSString *str);
myBlock = ^(NSString *str){
NSLog(@"%@",str);
};
myBlock(@"1111111");

(3)有参数有返回值

self.myBlock = ^int(int x, int y) {
return x+y;
};
self.myBlock(2, 5);

(4)无参数有返回值

self.myBlock = ^int{
return 20;
};
self.myBlock();

4.block作为OC的方法参数

(1)无参数传递的block

- (void)test:(void(^)())testBlock{
testBlock();
}

//调用方式
[self test:^{
NSLog(@"aaaa");
}];

(2)有参数传递的block

- (void)test:(void(^)(NSString *str))testBlock{
testBlock(@"aaaa");
}
//调用方式
[self test:^(NSString *str) {
NSLog(@"%@",str);
}];

5.block回调

block回调在项目中经常用到,小编就AFNetworking网络请求回调里摘取部分举例.

//.h 

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(nullable id)parameters
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;


//.m

NSURLSessionDataTask *sessionTask = [manager POST:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

if (failure) {
failure(error);
}

}];