您的位置:首页 > 其它

block访问外部变量

2015-12-29 12:01 369 查看
栈区 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的地址了.
*/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: