#import <Foundation/Foundation.h>
// Block塊的重定義
typedef int(^aBlock)(int, int);
typedef void(^bBlock)();
// 全局變量
int a = 100;
int main(int argc, const char * argv[])
{
// 定義block
// block類型為有參數(shù)有返回值
// int 表示的是返回值,(int,int)表示的是參數(shù)類型,MyBlock表示的是block塊的名字,^(托字符)的作用是block塊的標(biāo)識符
int(^MyBlock)(int, int) = ^(int a, int b)
{
return a + b;
};
// 調(diào)用block
int num = MyBlock(3, 4);
NSLog(@"有參有返回值num ======%d", num);
// 有參數(shù)無返回值
void(^MyBlock1)(int, int) = ^(int a, int b)
{
NSLog(@"有參無返回值======%d",a * b);
};
MyBlock1(4, 5);
// 無參數(shù)無返回值
void(^MyBlock2)() = ^()
{
NSLog(@"無參無返回值======你瞅啥!!");
};
MyBlock2();
// 無參數(shù)有返回值
int(^MyBlock3)() = ^
{
int a = 3;
int b = 5;
int c = a + b;
return c;
};
NSLog(@"無參數(shù)有返回值 ======%d",MyBlock3());
// Block與全局變量、局部變量的關(guān)系:
// a是全局變量,存放在全局區(qū)(靜態(tài)區(qū));c是局部變量,存放在棧區(qū)
NSLog(@"a = %d, 地址:%p", a, &a);
int c = 10;
NSLog(@"c = %d, 地址:%p", c, &c);
void(^myBlock)() = ^()
{
// block里可以訪問外面的全局變量,并修改值;也可以訪問外面的局部變量,但是不能改值
a = 8;
// a的地址沒變
NSLog(@"a = %d, 地址:%p", a, &a);
// 這里c存放在堆區(qū),block內(nèi)部的局部變量,地址是拷貝過來的,存放在堆區(qū)
NSLog(@"c = %d, 地址:%p", c, &c);
};
myBlock();
// 如果想在block內(nèi)部改變外部的值:
__block int d = 10;
NSLog(@"d = %d, 地址:%p", d, &d);
void(^block)() = ^()
{
d = 12;
NSLog(@"d = %d, 地址:%p", d, &d);
};
block();
NSLog(@"d = %d, 地址:%p", d, &d);
return 0;
}
demo截圖