block概念和基本使用
Object-C中衍生的数据类型:SELidBLOCKBOOLBoolean
---基本概念
定义个变量去存储代码块
函数名就是地址无需加&取地址符
#import <Foundation/Foundation.h>
int main(intargc, const char* argv[]) {
@autoreleasepool {
//定义一个block变量,并且赋值
void (^myBlock)()=^{
NSLog(@"hello");
};
myBlock();
typedef void(^Block) ();
Block b1 ;
b1=^{
NSLog(@"hello world");
};
b1();
//定义有参数有返回值的block
typedef int (^NewType1) (int ,int);
NewType1 nt1 =^(int a , int b){
return a+b;
};
int result = nt1(12,23);
NSLog(@"result ofnt1(12,23) = %d",result);
}
return 0;
}
#import <Foundation/Foundation.h>
int main(intargc, const char* argv[]) {
@autoreleasepool {
//有参有返回值
int (^myBlock2)(int,int)=^(int num1 ,intnum2){
NSLog(@"有参有返回值:%d",num1+num2);
return 0;
};
myBlock2(4,5);
//定义了边变量 后赋值
myBlock2=^(int x ,int b ){
NSLog(@"max=%d",x>b?x:b);
return 0;
};
myBlock2(4,5);
//有参数无返回值
void (^myBlock1)() = ^(int num1){
NSLog(@"有参无返回值:%d",num1);
};
myBlock1(45);
//无参无返回值 (可以省略())
//void(^myBlock4)()=^(){
void (^myBlock4)()=^{
NSLog(@"无参无返回值的block");
printf("无参无返回值的block\n");
};
myBlock4();
}
return 0;
}
5的地址变小了,所以不是同一个m
在堆区,地址后六位都会有内容
静态区或者常量区后四位没有0,前四位全是0)0x1000022322
block存在堆区,也算事一个对象。
当定义一个block的时候,block会把外部变量的值以const的方式复制一份,存放到block的所在的内存中
__block int m = 10 ;在block中就可以修改外部变量 m,
__block表示不再以
在block内部的变量值不能被修改。
在block内部创建的变量,存放到栈区,局部变量
Block应用场景
将重复的代码定义成代码块,作用:传递代码块
block变量作为workBlock函数的参数
函数名不能作为方法的参数传递
要也只能传函数指针
block作为函数的返回值
#import <Foundation/Foundation.h>
//先给block起一个别名
typedef void(^NewType)();
//用定义的类型作为函数的返回值
//返回值是block类型
NewType test(){
NewType w1 = ^{
NSLog(@"xxxxxxx");
NSLog(@"0000000");
};
return w1;//返回一个block
}
typedef int(^NewType2)(int,int) ;
//用定义的类型作为函数的返回值
NewType2 test2(){
return ^(int a,int b ){
return a+b;
};
}
int main(intargc, const char* argv[]) {
@autoreleasepool {
//接收返回结果
NewType n1 = test();
//执行block
n1();
NewType2 n2 = test2();
//执行block
int result = n2(2,2);
NSLog(@"%d",result);
}
return 0;
}
block快速提示
inLineBlock助记符
<#returnType#>(^<#blockName#>)(<#parameterTypes#>)= ^(<#parameters#>) {
<#statements#>
};
将代码拖动到{ }代码快中并写入title-
再'>'完成,可以在下次输入title的时候