Block注意事项
//1.block中可以访问外面的变量
int a = 10 ;
void (^myBlock)()=^{
NSLog(@"a = %i",a);
};
myBlock();//a = 10
//2.block中可以定义和外界同名的变量,如果定义同名变量,在block中访问的是block中的变量
int a = 10 ;
void (^myBlock)()=^{
int a = 20;
NSLog(@"a = %i",a);
};
myBlock();//a = 20
//3.默认情况下,不可以在block中修改外界变量的值
//block中的变量和外界的变量并不是同一个变量
//如果block中访问到了外界的变量,block会将外界的变量拷贝一份到堆内存中,可以打印内存地址查看
//因为block中使用的外界变量是copy的,修改调用之前的变量的值,不会影响到block中copy的值
int a = 10 ;
NSLog(@"&a = %p",&a);// &a = 0x7fff5fbff84c
void (^myBlock)()=^{
NSLog(@"&a = %p",&a);
// &a = 0x100700710
NSLog(@"a = %i",a);
};
a = 40;
myBlock();//a = 10
//如果想在block中修改外界变量的值,必须在外界变量前加上__block
//如果在block中修改了外界变量的值,会影响到外界变量的值
__block int a = 10 ;
NSLog(@"a = %i",a);//10
void (^myBlock)()=^{
a = 40;
NSLog(@"a = %i",a);//40
};
myBlock();
//为什么不加__block不能修改block中修改外界的值
//因为在编译的文件中main.cpp中a 是作为值传递
int a = 10 ;
void (^myBlock)()=^{
NSLog(@"a = %i",a);
};
myBlock();
//为什么加了__block能修改block中修改外界的值
//如果加了__block之后就是地址传递,所以可以在block中修改外界变量的值
__block int a = 10 ;
void (^myBlock)()=^{
a = 50;
NSLog(@"a = %i",a);
};
myBlock();
block是存储在堆中还是栈中
默认在栈中,如果对一个block进行copy操作,block会转移到堆中
栈的存储方式是先进后出,存的时候:第一份先存到栈底,最后的一份存到栈顶,取的时候先取出栈顶的,最后取出栈底的