栈区 0x7fff5fbff7bc
堆区 0x100600180 (如何判断? 一般后6位 有内容, 不是零 -- 如果是静态区或者常量区的话 后4位有内容, 前面都是零 一般)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
int m = 10;
NSLog(@"out m addr = %p",&m); // 栈区
//当定义block的时候,block会把外部变量以const的方式复制一份
//存放到block的所在的内存中...
void (^myBlock)() = ^(){
NSLog(@"addr = %p",&m); // 堆区
NSLog(@"in block m = %d",m);
};
myBlock();
};
return 0;
}
block内部不允许修改外部变量值
如果需要修改外部变量值, 得加上修饰符 __block int m = 10;
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
__block int m = 10;
NSLog(@"out m addr = %p",&m); // 栈区
//存放到block的所在的内存中...
void (^myBlock)() = ^(){
m = 100; // 加上 __block 还是会拷贝(但不是const方式, 所以能修改...), 地址不一样.
NSLog(@"addr = %p",&m); // 堆区
NSLog(@"in block m = %d",m);
};
myBlock();
};
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
__block int m = 10;
NSLog(@"out m addr = %p",&m); // 栈区
//存放到block的所在的内存中...
void (^myBlock)() = ^(){
m = 100; // 加上 __block 还是会拷贝(但不是const方式, 所以能修改...), 地址不一样.
NSLog(@"addr = %p",&m); // 堆区
NSLog(@"in block m = %d",m);
};
myBlock();
NSLog(@"in block m = %d",m);
NSLog(@"out m addr = %p",&m);
};
return 0;
}
/**
block[37442:1575659] out m addr = 0x7fff5fbff808
block[37442:1575659] addr = 0x100204a88
block[37442:1575659] in block m = 100
block[37442:1575659] in block m = 100
block[37442:1575659] out m addr = 0x100204a88 // m 的地址变成 block里的m的地址了.
*/