[黑马IOS自学第十七篇]OC BLOCK学习

来源:互联网 发布:用电脑看小说的软件 编辑:程序博客网 时间:2024/05/16 02:56

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,前四位全是00x1000022322

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的时候

2 0