block块对:局部变量、__block变量、静态变量、全局变量四种变量的操作及其作用
int d = 40;//全局变量
int main(int argc, const char * argv[])
{
int a = 10;//局部bianl
int *p = &a;
NSLog(@"a:%i",a);//对变量值和地址进行测试
NSLog(@"a:%p",&a);
__block int b = 20;//__block变量
NSLog(@"b:%i",b);
NSLog(@"b:%p",&b);
static int c =30;//静态变量
NSLog(@"c:%i",c);
NSLog(@"c:%p",&c);
NSLog(@"d:%i",d);
NSLog(@"d:%p",&d);
void (^myBlock)() = ^void()
{
//block块中对外面的变量都进行了一次复制,所以block块中变量的地址和外面的地址都发生了改变
//x = 20; 不能改变局部变量的值,否则出错
NSLog(@"a:%p",&a);
*p = 11;//可以通过指针对改变局部变量赋值,但是这样并不能改变局部变量对值和地址
NSLog(@"a:%i",a);
NSLog(@"a:%p",&a);
NSLog(@"b:%p",&b);
b = 21;//可以对__block变量进行赋值操作,并且改变了变量的值和地址
NSLog(@"b:%i",b);
NSLog(@"b:%p",&b);
NSLog(@"c:%p",&c);
c = 31;//可以对静态变量进行赋值操作,改变了变量的值但是没有改变变量的地址
NSLog(@"c:%i",c);
NSLog(@"c:%p",&c);
NSLog(@"d:%p",&d);
d = 41;//可以对全局变量进行赋值操作,改变了变量的值但是没有改变变量的地址
NSLog(@"d:%i",d);
NSLog(@"d:%p",&d);
};
myBlock();
NSLog(@"a:%i",a);
NSLog(@"a:%p",&a);
NSLog (@"b:%i",b);
NSLog(@"b:%p",&b);
NSLog(@"c:%i",c);
NSLog(@"c:%p",&c);
NSLog(@"d:%i",d);
NSLog(@"d:%p",&d);
a = 12;
b = 22;
c = 32;
d = 42;
NSLog(@"a:%i",a);
NSLog(@"a:%p",&a);
NSLog (@"b:%i",b);
NSLog(@"b:%p",&b);
NSLog(@"c:%i",c);
NSLog(@"c:%p",&c);
NSLog(@"d:%i",d);
NSLog(@"d:%p",&d);
return 0;
}