------- android培训、java培训、期待与您交流! ----------
block类型是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它
还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。
你可以用block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。作为一个回调,block特别
的有用,因为block即包含了回调期间的代码,又包含了执行期间需要的数据。
用 ^ 操作符来声明一个block变量,并指明block述句的开始 。block的主题部分包含在 { } 内。
blcok最简单形式
void(^block名)()= ^ { };
block代码块分为4种
有参有返回值
int (^myblock)(int ,int ) = int ^(int a ,int b){
}
有参无返回值
void(^myblock)(int ,int ) = ^(int a ,int b){
}
无参有返回值
int (^myblock)() = ^(){
}
无参无返回值
void(^myblock)( ) = ^(){
}
block的typedef
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
void(^myBlock)() = ^{
NSLog(@"helloworld");
};
myBlock();
//定义一个别名
//给没有返回值 没有参数的block起一个别名
typedef void (^Block)();
Block b1;
b1 = ^{
NSLog(@"helloworld");
};
b1();
//定义有参数有返回值的block类型
//定义新的别名
//返回值是int,有两个int类型的参数
typedef int(^NewType1)(int ,int);
NewType1 nt1 = ^(int a ,int b){
return a+b;
};
NewType1 n1,n2,n3;
n1 = ^(int x,int y){
return x>y?x:y;
};
int s = nt1(2,13);
NSLog(@"s = %d",s);
}
return 0;
}
block访问外部变量
#import <Foundation/Foundation.h>
void test(){
int m = 10;
// m = 10;
NSLog(@"1m = %d",m);
NSLog(@"2m addr = %p",&m);
//当定义block 的时候,block会把外部变量的值复制一份
//存放到block所在的内存
//以const拷贝的方式访问非局部变量
void(^block)( )=^{
//m的值不能被修改,因为是以const的方式拷贝过来的
m = 100;
NSLog(@"4m addr = %p",&m);//堆区
// 可以访问m的值
NSLog(@"3in block m = %d",m);
};
block();
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
<span style="white-space:pre"> </span>//__block修饰外部变量
__block int m = 10;
NSLog(@"m add = %p",&m);
//不再以const的方式拷贝
void(^block)( )=^{
//m的值能被修改
m = 100;
NSLog(@"4m addr = %p",&m);//堆区
// 可以访问m的值
NSLog(@"3in block m = %d",m);
};
block();
<pre name="code" class="objc"> //这里的m的值提取的是block内部的值
NSLog(@"5 m = %d",m);
block作为函数的返回值
#import <Foundation/Foundation.h>
//使用typedef定义一个新的类型
typedef void (^newType)() ;
//用新定义的类型作为函数的返回值
newType test(){
return ^{
NSLog(@"xxx");
NSLog(@"beijing ");
};
}
//重新定义了一个新的类型 newType2
typedef int(^newType2) ();
newType2 test2(){
return ^(int a,int b){
return a+b;
};
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//定义block类型的变量,接收函数返回值
newType n1 ;
newType2 n2 = test2();
n1 = test();
//执行
n1();
//调用block
int s = n2(22,12);
NSLog(@"s = %d", s);
}
return 0;
}