//代碼塊:普通代碼塊 構造代碼塊 靜態代碼塊數組
//一.定義一個普通代碼塊函數
//定義方式1 返回類型 (^代碼塊名稱) (參數類型) = ^(參數類型 參數名){};spa
//1.無返回類型的代碼塊 參數類型可爲空也可爲其餘類型3d
void (^my_block1) (void) = ^(void)orm
{排序
NSLog(@"hello world");遞歸
};ip
my_block1();作用域
void (^my_block) (int) = ^(int number)it
{
number = 1;//帶參數進入代碼塊運算 結果爲5 當進入做用域裏面的時候給number再次賦值 此時5將被覆蓋 結果number爲1
NSLog(@"%i",number);
};
my_block(5);
//2.有返回類型的代碼塊
int (^my_blockI) (int number) = ^(int number)
{
return number * number;
};
int num = my_blockI(10);
NSLog(@"%i",num);
//定義方式2 返回類型 (^代碼塊名稱) (參數類型);
// 代碼塊名稱 = ^(參數類型 參數名){};
void (^my_block2) (int);
my_block2 = ^(int number)
{
NSLog(@"%i",number);
};
my_block2(9);
//帶兩個參數的代碼塊
int (^sumBlock) (int,int) = ^(int number1,int number2)
{
return number1 + number2;
};
int result = sumBlock(5,9);
NSLog(@"result:%i",result);
//在代碼塊外邊定義的變量能夠在代碼塊裏面使用
int addSum = 0;
for (int i=1; i<=10; i++) {
addSum = sumBlock(addSum,i);
}
NSLog(@"sum:%i",addSum);
//二.構造代碼塊
//用構造塊的關鍵字定義代碼塊 typedef 注意:參數類型和參數的個數要保持一致
typedef void (^my_block3)(int);//構建了一個代碼塊類型
my_block3 num1 = ^(int number)
{
NSLog(@"num:%i",number);
};
num1(8);
//數組的一個方法 代碼塊能夠做爲一個參數 該方法可對一個數組進行排序 sortedArrayUsingComparator
NSArray *array = @[@"hello",@"person",@"father",@"hunter"];
NSArray *arr = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@",arr);
//--------局部變量
int a=10, b=20;
typedef int (^multiplyBlock)(void);
multiplyBlock multiply = ^(void)
{
return a * b;
};
NSLog(@"result1=%i",multiply());//輸出結果爲200
a=20,b=30;
NSLog(@"result2=%i",multiply());//輸出結果仍是200 a b的值沒有發生改變
//---------全局變量
static int c=10, d=20;
typedef int (^multiplyBlock2)(void);
multiplyBlock2 multiplyI = ^(void)
{
return c*d;
};
NSLog(@"result3=%i",multiplyI());//輸出結果爲200
c=20,d=30;
NSLog(@"result4=%i",multiplyI());//輸出結果爲600 a b的值發生改變
// static void (^addblock)(int,int) = ^(int i,int sum)
// {
// for (i=0; i<11; i++) {
// sum += i;
// }
//
// NSLog(@"result=%i",sum);
// };
// addblock(0,0);
//三.靜態代碼塊
//代碼塊的遞歸調用 (遞歸調用的意思是本身能夠調用本身) 遞歸調用的前提是代碼塊變量必須是全局變量或靜態變量
static void(^const block)(int) = ^(int i)
{
if (i>0) {
NSLog(@"num:%i",i);
block(i-1);
}
};
block(3);
//遞歸方式計算1到10的和
static int(^sum_block)(int) = ^(int number1)
{
if (number1<11) {
// NSLog(@"sum:%i",number1);
number1 += sum_block(number1+1);
NSLog(@"sum:%i",number1);
}
return number1;
};
sum_block(1);
static int i =10;
typedef int (^block3)(void);
block3 tem = ^(void)
{
i += 1;
return i;
};
NSLog(@"%i,%i",i,tem());
//在代碼塊中可使用代碼塊改變全局變量
void(^block4)(void) = ^(void)
{
global++;//在主函數外定義
NSLog(@"%d",global);
};
//此時在代碼塊外的全局變量的值也發生了改變
block4();
NSLog(@"%i",global);
//用__block在代碼塊內部能夠修改代碼塊外部的值
__block int a1= 10;
int (^block5)(int,int) = ^(int data1,int data2)
{
a1 = data1 * data2;
return a1;
};
NSLog(@"dataResult:%i",block5(3,5));//此時a1的結果爲15 a1的值被修改