1.Block的概念
block也就是通常所说的代码块,block可以用来存储代码。block用来封装和存储代码是和函数差不多的,block可以在任何时候执行。
block和函数有以下相似性:保存代码;有返回值;有形参;调用方式一样。
2.用代码来说明block的简单特性与用法
//
// main.m
// BlockDemo_01
//
// Created by QiZhang on 8/4/15.
// Copyright (c) 2015 QiZhang. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//1.有一个参数的block
void (^myBlock01)(int)=^(int x){
NSLog(@"BLOCK ---begin----");
for (int i = 0; i<x; i++) {
NSLog(@"*****");
}
};
myBlock01(10);
// 2.有两个参数的block
int (^addBlock01)(int,int)=^(int x,int y){
return x + y;
};
NSLog(@"\n 7+8 =%d ",addBlock01(7,8));
// 3.没有参数的block:有两中定义形式
void (^noParamBlock)() = ^{
NSLog(@"\nI am a bloc with no parameters 1");
};
noParamBlock();
void (^noParamBlock2)()=^(){
NSLog(@"\nI am a block with no parameter 2");
};
noParamBlock2();
// 4.block用在字符串数组的排序中
NSArray *strArray = [NSArray arrayWithObjects:@"abc1",@"abc5",@"abc3",@"abc0", nil];
NSComparator sortBlock = ^(id str1,id str2){
return [str1 compare:str2];
};
NSArray *sortArray = [strArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray%@",sortArray);
// 5.代码块的递归调用
static void (^blocks)(int) = ^(int i){
if (i > 0) {
NSLog(@"num:%d",i);
blocks(i - 1);
}
};
blocks(3);
/* 6.在代码块中使用局部变量
默认情况下,block内部不能修改外部的局部变量。
给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
*/
__block int local = 50;
void (^areaBlock)(void) = ^(void){
local++;
NSLog(@"local:%d",local);
};
areaBlock();
NSLog(@"local:%d",local);
// 7.利用typedef定义block类型(类似于指向函数的指针)
typedef int (^myblock)(int ,int);
// 下面就可以利用这种类型来定义block变量了
myblock a,b;
a = ^(int a,int b){return a-b;};
b = ^(int n1,int n2){return n1*n2;};
NSLog(@"4-1=%d",a(4,1));
NSLog(@"3*2=%d",b(3,2));
return 0;
}