黑马程序员——入学Blog09----OC的Block

-----------android培训java培训iOS培训.Net培训、期待与您交流!------------  
       Block即块,在OC中可以使用它来封装代码,在运行中保存代码,而且Block可以作为函数参数或者函数的返回值,而本身也可以带参数和返回值。block在多线程,异步,集合遍历,动画等场景被广泛使用。
      先看一段代码,摘自苹果官方的文档
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {  
    return num * multiplier;
};

           

     从中可以很容易了解到一个Block的结构以及如何定义一个Block。
  1.    Block的标志位 ^
  2.    Block的名称为 myBlock
  3.    Block的参数为一个int,且名称为num
  4.    Block的返回值为一个int
  5.    Block的主体为{ return num * multiplier; }
      调用上面的Block使用
NSLog(@"%d", myBlock(3));
运行结果:

       Block可以访问外部的变量,这一点函数是做不到的。



      如上图所示,如果在Block内想要修改直接外部的局部变量是不被允许的,但是根据错误提示,可以在d前加上__block类型修饰符,即可在Block内进行修改。
      
//  main.m


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        __block int d = 0;
        // 计算一点到坐标原点的距离
        double (^distance)(double , double) = ^(double x, double y){
            d = pow(x, 2) + pow(y, 2);
            return pow(x, 2) + pow(y, 2);
        };
        NSLog(@"坐标(5,4),距原点 = %lf",distance(5,4));
        
        
    }
    return 0;
}

     运行结果为:


     可以使用typedef为Block定义别名,比如上面的程序可以改写成:
//  main.m


#import <Foundation/Foundation.h>
typedef double(^Distance)(double,double);
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        __block int d = 0;
        // 计算一点到坐标原点的距离
        Distance distance = ^(double x, double y){
            d = pow(x, 2) + pow(y, 2);
            return pow(x, 2) + pow(y, 2);
        };
        NSLog(@"坐标(5,4),距原点 = %lf",distance(5,4));
        
        
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值