别怪我懒啊,自己看备注,关键留给自己以后看,我用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;
}