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