// 栈区,堆区,BSS,数据区,代码区spa
#import <Foundation/Foundation.h>.net
int main(int argc, const char * argv[]) {orm
@autoreleasepool {内存
// 第一种和第二种get
//int i = 10; // 栈区编译器
// 第三种 __block修饰符告诉编译器,i的值能够在block内部修改(忽略检查)io
// 注意:一旦使用__block修饰以后,之后使用的都是堆区的变量。编译
__block int i = 10;import
NSLog(@"i = %d, i addr = %p", i,&i); // i = 10, i addr = 0x7fff5fbff77c变量
// 定义一个无参无返回值的block
// 注意在block代码块的内部使用外部变量,
// 1)在block定义的时候,把block外部的变量的值copy到了内存的堆区
// 2)拷贝的过程当中使用了const(以const的形式把外部变量作了一个copy)
void (^myblock)() = ^{
// 第一种
// i = 100; 会报错
// block 代码块
// 1)可否使用变量i
//NSLog(@"i = %d", i); // i = 10
// 2)变量i存储在哪一个内存区域
//NSLog(@"i addr = %p",&i); // addr = 0x100102750 堆区
// 第二种
//int i = 100; // 这是定义一个局部变量 栈区
//NSLog(@"i = %d", i); // i = 100
//NSLog(@"i addr = %p",&i); // addr = 0x7fff5fbff72c
// 第三种 必定要修改i
i = 100;
NSLog(@"i = %d, i addr = %p", i,&i); //i = 100, i addr = 0x1004004b8
};
myblock();
i = 20;
NSLog(@"i = %d, i addr = %p", i,&i); //i = 20, i addr = 0x7fff5fbff77c
// i = 20, i addr = 0x1004004b8 第三种
}
return 0;
}