咱們知道,對象與對象之間的通訊方式有如下三種:一、代理-協議;二、通知;三、block。三種方式都實現了對象之間的解耦合。其中不一樣就是:通知的通訊方式是1對多;代理、block的通訊方式是1對1.閉包
//int 是返回值;sumBlock 是Block變量類型;(int x,int y)括號裏面是參數。 int(^sumBlock)(int x,int y);
1 //建立 myBlock 2 - (void)createMyBlock { 3 //定義block變量 4 int(^sumBlock)(int x,int y); 5 //實現block,而且賦值 6 sumBlock = ^(int x,int y){ 7 return x + y; 8 }; 9 //聲明myBlock變量,全局{int(^myBlock)(int x,int y);}
10 myBlock = sumBlock; 11 NSLog(@"%d",myBlock(20,20)); 12 }
Block有如下4種方式:函數
1 //Block是匿名函數,沒法經過函數名調用,因此單獨使用沒有意義 2 // 1.無參數 無返回值--與直接打印數據是同樣的效果,無心義 3 ^(){ 4 NSLog(@"無參數 無返回值"); 5 }(); 6 7 // 2.有參數 無返回值 8 ^(int a,NSString* text){ 9 NSLog(@"%d \n %@",a,text); 10 }(10,@"有參數 無返回值"); 11 12 // 3.有返回值 無參數 13 NSString* a = ^(){ 14 return @"無參數 有返回值"; 15 }(); 16 NSLog(@"%@",a); 17 18 // 4.有參數 有返回值 19 //定義block變量 20 int(^sumBlock)(int x,int y); 21 //實現block,而且賦值 22 sumBlock = ^(int x,int y){ 23 return x + y; 24 }; 25 NSLog(@"%d",sumBlock(10,10)); 26 }
1 //有參數 有返回值(返回結果是 6 ) 2 int(^powefBlock)(int x,int y); 3 powefBlock = ^(int x,int y){ 4 return x * y; 5 }; 6 NSLog(@" powef = %d",powefBlock(2,3));
引用局部變量編碼
1 // 若是在block 代碼內部,使用外部變量時,number會變爲常量 2 int number = 10; 3 ^(){ 4 //number = 20; 直接報錯 ---不能夠修改,已經變爲常量 5 NSLog(@"%d",number); 6 }(); 7 8 //--在內部改變- 9 //在變量前加__block 聲明便可 10 __block int number_1 = 10; 11 ^(){ 12 number_1 = 20; 13 NSLog(@"%d",number_1); 14 }();
#import <Foundation/Foundation.h> @interface MyObject : NSObject { //block 引用外部 成員變量 int _number; } - (void)log; @end
1 - (void)log { 2 3 // block 引用外部 成員變量 4 _number = 99; 5 NSLog(@"---%ld-- ",self.retainCount); 6 // 使用block 修飾obj 對象 這樣obj 在block中使用不會被retain。 7 // obj 不能擁有 self 的全部權 block不會持有self對象 8 __block MyObject* obj = self; 9 ^(){ 10 // 判斷 obj 是否存在 11 if (!obj) { 12 return ; 13 } 14 //經過obj 獲取成員變量;打印結果是 1 15 int a = obj -> _number; 16 NSLog(@"---%d-- ",a); 17 NSLog(@"*****%ld**** ",self.retainCount); 18 }(); 19 20 }
1 //--------引用外部obj對象的時候---------- 2 //不會被retain,即obj1.retainCount始終是1 3 //__block NSObject* obj1 = [[NSObject alloc] init]; 4 //延時調用之後,obj1.retainCount會變爲2 5 NSObject* obj1 = [[NSObject alloc] init]; 6 NSLog(@"%ld",obj1.retainCount); 7 8 //延時調用 9 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 10 NSLog(@"%ld",obj1.retainCount); 11 });
歡迎讀者查閱,如若轉載,請標明出處。spa