//
// main.m
// OC语言学习
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//1.block中可以访问外面的变量
int a = 10;
void (^myBlock)() = ^{
NSLog(@"a = %i",a);
};
myBlock(); //输出: a = 10
//2.block中可以定义和外界同名的变量
int a1 = 10;
void (^myBlock1)() = ^{
int a1 = 20;
NSLog(@"a1 = %i",a1);
};
myBlock1(); //输出:a1 = 20
//3.默认情况下,不可以在block中修改外界变量的值
int a2 = 10;
void (^myBlock2)() = ^{
NSLog(@"a2 = %i",a2);
};
a2 = 20;
myBlock2(); //输出: a2 = 10
//3.1在block中修改外面变量的值
__block int a3 = 10;
void (^myBlock3)() = ^{
a3 = 50;
NSLog(@"a3 = %i",a3);
};
myBlock3(); //输出:a3 = 50
//4.block是存储在堆中还是栈中?
/*
默认情况下,block存储在栈中,如果对block进行一个copy操作,block会转移到堆中
如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作
但是如果block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain
*/
//所以,如果在block中访问了外界的对象,一定要给对象加上 __block,只要加上 __block,
//即使block存储在堆中,也不会对外界的对象进行retain
return 0;
}