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

本文详细介绍了Objective-C中的Block,包括其概念、存储位置、如何定义与使用。讲解了Block如何复制外部变量并在堆区存储,以及__block关键字的作用,允许在Block内修改外部变量。还探讨了Block在简化重复代码、作为函数参数和返回值等方面的应用,并提供了快速编写Block的助记符模板。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值