从代码来看block

34 篇文章 0 订阅
8 篇文章 0 订阅

别怪我懒啊,自己看备注,关键留给自己以后看,我用c++写的,自己理解oc什么样。

//

//  main.cpp

//  sunshine

//

//  Created by Sun on 13-10-22.

//  Copyright (c) 2013 Sun. All rights reserved.

//

/*

 可以把block当做objectvie-c的匿名函数。 block允许开发者在两个对象之间任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(closure).又能很直观,很容易的获取上下问的相关状态信息

 

 block使用了与函数相同的机制:可以向生命函数一样,来声明一个block变量,可以利用定义一个函数的方法来定义一个block;可以将block当做一个函数来调用

 */

#include <iostream>

using namespace::std;



int main(int argc,constchar * argv[])

{


    // insert code here...

    std::cout <<"Hello, World!\n";

    //利用插入符distanceFromRateAndTime变量标记为一个block。就像函数声明一样,需要包含返回值类型,以及参数的类型。这样编辑器才能安全的进行强制转换。    block假象成一个值,当我们把block赋值给distanceFromRateAndTime后,就可以像调用函数那样调用block了。

   double(^distanceFromRateAndTime)(double rate,double time);

    distanceFromRateAndTime=^double(double rate,double time){

       return rate*time;

    };

    

   double dx=distanceFromRateAndTime(35,1.5);

    

   cout<<"有参:"<<dx<<endl;

    

    

    //不带参数的block定义block的时候返回值也是可选的

   double(^randomPercent)()=^{

       return (double)arc4random()/4294967295;

    };


   cout<<"无参数的生成随机数:"<<randomPercent()*100<<endl;

    

    //block的闭包性,所谓的闭包性,可以向普通函数一样访问数据:局部变量、传递给block的参数,全书变量/函数。并且由于block具有闭包性,所以还能访问非局部变量,但是非局部变量回忆const变量被拷贝并保存到block中,也就是说对block时只读的。这时候如果尝试在block内部对局部变量赋值,会报错

   int a=10;

   int (^getNumber)(int*)=^(int * num){//要想修改局部变量a必须通过指针修改

        //a++;//这里会报错

        cout<<a<<(*num)++<<endl;

       return * num;

    };

   cout<<getNumber(&a)<<endl;

   cout<<a<<endl;

    

    //用法可以使block运行的结果以块儿的形式存在

    //sample

    

   int a1=10;

    

   int  (^getNumber_0)(int)=^(int num){

       return a1+num;

    };

   cout<<"镜像内容(值并未真正修改):"<<getNumber_0(10)<<endl<<"原值结果:"<<a1<<endl;

    

    

    //修改局部变量,冻结中的非局部变量是一个常量值,这也是一种默认的安全行为--因为这可以防止block中的代码对全局变量做了任意修改。那么如果还希望block中对非局部变量进行修改---使用__block存储修饰符来声明非局部变量

    __block int x=10;

    

   int (^getNumber_1)(int)=^(int num){

        

       return x=x+num;

    };

   cout<<"修改后x的值:"<<getNumber_1(1)<<endl

    <<getNumber_1(1)<<endl

    <<getNumber_1(1)<<endl;

    

     //block在作为函数的参数的时候也特别有用,比如将其用作函数的参数,这可以解决累世函数指针解决的问题,不过我们也可以定义内联block,这样代码更加易读

   void func1(int x,double (^getNumberX)(double num));

    

   func1(10, ^(double x1){

        

       return5.0;

    });

   

    

   return0;


}


void func1(int x,double (^getNumberX)(double num)){

   cout<<x+getNumberX(x)<<endl;

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值