1. block 的基本概念 // 了解
block是一个类型,可以定义变量,它的变量是用来存代码块.
2.block的基本用法 // 固定写法牢记
block最简单形式
定义格式:void (^block名) ( ) =^{代码块;}
使用格式: block名( );
/*
定义是,把block当初数据类型
特点:1,类型比函数定义多了一个^
2.设置数值,有一个^,内容是{}括起的一段代码
void (^myBlock)()=^{
NSLog(@"Hello");
};
myBlock( );
*/
-
#import <Foundation/Foundation.h>
-
// 定义了一个没有参数,没有返回值的block变量,并且赋值了
-
// 优化版 void (^myBlock4) ( )=^{} 去掉了一对小括号
-
void (^myBlock4) ( )=^( ) {
-
NSLog(@"xxxx");
-
printf("xxxxx") //无参无返回值
-
};
-
myBlock4( ); // 使用block变量
-
-
// 第二种格式: 有参无参返回值
-
// 定义一个变量myblock2 同时进行赋值
-
-
void (^myblock2) (int, int)=^ (int a, int b){
-
-
NSLog(@"a+b=%d",a+b);
-
};
-
myblock2(34,12);
-
-
return;
-
};
-
// 第三种格式: 有参有返回值类型
-
返回值类型(^变量名) (参数类型及个数)=^(形参列表){
-
代码块语句;
-
-
-
-
int (^myblock1) (int, int) =^(int x ,int y){
-
-
return x+y;
-
};
-
-
// 给变量重新赋值
-
myblock1=^(int x ,int y) {
-
return x*y;
-
-
};
-
sum=myblock (10,20) ;
-
NSLog(@"sum=%d",sum);
6.block的typedef
格式:typedef 返回值类型(^block变量名) (参数类型列表);
Typedef int(^myBlock)(int,int);
// 给无参无返回值block变量起别名;
// 用新的类型定义block变量 newType t1;
t1=^{NSLog (@"我是使用newType定义出来的变量t1的值);
};
使用block t1();
8.block 访问外部变量 // 重点掌握
1) 在block内部可以访问block外部的变量,但是注意,这是一个新的内存空间变量.
block内部也可以定义和block外部同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域.
2) 在block内部不可以修改block外部的变量,防止破坏代码的可读性,也不利于维护.
给局部变量加上__block关键字,则这个局部变量可以在block内部修改
For example :
#import <Foundation/Foundation.h>
int main(){
int m=10;
NSLog(@"m=%d",m); // m为10;
// 定义变量并赋值
void (^myBlock)()=^{
NSLog(@"in block m=%d",m) // m没有打印出来
};
return 0;
}
For example 2:
#import <Foundation/Foundation.h>
int main ( ) {
int m=10 ;
NSLog(@"1:m=%d",m);
NSLog(@"2:m add =%p",&m) ; // 栈区地址与堆区地址一样
void (^myBlock)()=^{
NSLog(@"3:m add =%p",&m);
NSLog(@"5:m=%d",m); // m 为10
};
NSLog(@"6:m add=%p",&m); // 堆区的地址
myBlock();
return 0;
}