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.默認(rèn)情況下逼侦,不可以在block中修改外界變量的值
//block中的變量和外界的變量并不是同一個變量
//如果block中訪問到了外界的變量冕广,block會將外界的變量拷貝一份到堆內(nèi)存中疏日,可以打印內(nèi)存地址查看
//因為block中使用的外界變量是copy的,修改調(diào)用之前的變量的值撒汉,不會影響到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是存儲在堆中還是棧中
默認(rèn)在棧中挠阁,如果對一個block進行copy操作,block會轉(zhuǎn)移到堆中
棧的存儲方式是先進后出溯饵,存的時候:第一份先存到棧底侵俗,最后的一份存到棧頂,取的時候先取出棧頂?shù)姆峥詈笕〕鰲5椎?/p>