//
// main.m
// block访问外部变量
//
// Created by herobin on 16/1/5.
// Copyright © 2016年 herobin. All rights reserved.
/*
注意:
1 静态变量 和 全局变量,在加和不加 __block 都会直接引用变量地址,也就意味着,可以修改变量的值
2 常量变量(NSString *a = @"hello"; a为变量,@"hello"常量) 不加 __block类型,block会引用常量的地址(浅拷贝). 加__block类型,block会去引用常量变量(如:a变量,a =@"abc",可以任意修改a指向的内容)的地址
如果不加__block 直接在block内部修改变量,会编译报错. block 内部改变量是 只读的.
*/
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// int m=100; //局部变量,存储在内存的栈区
__block int m=100; //加了修饰符__block
NSLog(@"m =%d,addm =%p",m,&m);
//第一种情况
//定义一个无参无返回值的block变量
// void (^myblock)()=^(){
// NSLog(@"inBlock m =%d,addm =%p",m,&m); //m 在堆区了 和局部变量m不是一个地址
// };
//第二种情况
// void (^myblock)()=^(){
//
//
// m = 10; //此时m是和外部同名的一个变量
// //并且此处的m会屏蔽掉外部变量的作用域
// //也是局部变量,也是存放在栈区
// NSLog(@"inBlock m =%d,addm =%p",m,&m);
// };
void (^myblock)()= ^ {
// m = 1000;
// 默认情况下不可以在block内部对外部的变量进行修改
// 1 外部的变量,以const的方式拷贝过来的,const方式不能修改
// 2 保证程序的可读性(一般在函数/或者代码块内部不对外部变量进行操作)
// 如果非要对外部变量进行修改,那么必须在外部变量的前面加上 __block
// __block 是一个标识,表示我们的外部变量, 可以在block内部进行修改,让编译器忽略检查
// 同时,block代码块之后,再使用m的值,都是堆区的m
m= 10000;
NSLog(@"inBlock m=%d,addm=%p",m,&m);
};
//
myblock();
m=10; //重新赋值
NSLog(@"m =%d,addm =%p",m,&m); //现在的m是堆区的m了
}
return 0;
}
|
|