黑马程序员——oc加强学习(block)

------- 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值