Block
block
实际上是Objective-C
语言对闭包的实现。
闭包(Closure)
闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。
闭包允许一个函数访问声明该函数运行上下文中的变量,以及不同运行上下文中的变了。
function funA(callback){
alert(callback());
}
function funB(){
var str = "Hello World"; // 函数funB的局部变量,函数funA的非局部变量
funA(
function(){
return str;
}
);
}
因为闭包性,上面函数funA
中的callback
可以访问到funB
中的变量str
。
Block
block的结构.png//
// ViewController.h
// blockLearn
//
// Created by xiaodoubaba on 16/2/10.
// Copyright © 2016年 xiaodoubaba. All rights reserved.
//
#import <UIKit/UIKit.h>
//定义block类型
typedef int(^typedefBlock)(int);
@interface ViewController : UIViewController
//自定义类型的block
@property (copy, nonatomic) typedefBlock myBlock;
//block作为property 直接定义
@property (copy, nonatomic) NSString * (^propertyBlock)(int);
//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure;
@end
//
// ViewController.m
// blockLearn
//
// Created by xiaodoubaba on 16/2/10.
// Copyright © 2016年 xiaodoubaba. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self insideBlock];
//property block的定义
self.propertyBlock = ^(int num) {
NSString *returnStr = [NSString stringWithFormat:@"passed num: %d",num];
return returnStr;
};
self.propertyBlock(2);
//可以用于不同页面间传值 将3传给其他页面
self.myBlock(3);
//调用外部block
int outSideResult = outSideBlock(5);
NSLog(@"outSideResult is %d", outSideResult);
//调用外部返回对象
NSString *strResult = returnString(@"World");
NSLog(@"%@",strResult);
}
#pragma mark - 定义在方法内的Block
- (void)insideBlock{
//无返回值无参数
void (^noArgsNoReturn)() = ^(){
NSLog(@"No Args And No Return");
};
//调用noArgsNoReturn
noArgsNoReturn();
//无返回值有参数
void (^argsNoReturn)(int) = ^(int num){
NSLog(@"%d",num);
};
//调用argsNoReturn
argsNoReturn(9);
//有返回值有参数
int (^argsReturn)(int) = ^(int num){
return num * 5;
};
//调用argsReturn
int result = argsReturn(10);
NSLog(@"result is %d",result);
}
#pragma mark - 定义在方法外的Block
//定义在方法外的
int (^outSideBlock)(int) = ^(int num) {
return num * 5;
};
//返回对象
NSString* (^returnString)(NSString *) = ^(NSString *str) {
NSString *joinStr = [NSString stringWithFormat:@"Hello %@",str];
return joinStr;
};
#pragma mark - block做为函数参数
//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure
{
NSString *str = [NSString stringWithFormat:@"%d",age];
if (age >= 18) {
NSString *string = [NSString stringWithFormat:@"年龄%d,已经成年了!",age];
//成功回调
success(string);
}else{
NSError *error = [NSError errorWithDomain:@"还未成年" code:0000 userInfo:nil];
//失败回调
failure(error);
}
return str;
}
#pragma mark - 作为参数bloc的使用
- (void)argsBlockExecute
{
[ViewController callBackFunc:26 success:^(NSString *tip) {
NSLog(@"我成年了!");
} failure:^(NSError *error) {
NSLog(@"我还年轻!");
}];
}
@end
网友评论