iOS block的簡單使用與介紹(一)

自從block出現(xiàn)之后,很多API都開始采用這樣的結(jié)構(gòu),由此可見,block確實(shí)有許多優(yōu)勢存在,譬如可以取代協(xié)議,增加程序的可讀性,這里將一些簡單用法總結(jié)如下:
一、如何聲明一個(gè)block變量

我們通過^符號來聲明block類型,形式如下:

void (^myBlock)();

其中第一個(gè)void是返回值,可以是任意類型,中間括號中^后面的是這個(gè)block變量的名字,我把它命名為myBlock,最后一個(gè)括號中是參數(shù),如果多參數(shù),可以寫成如下樣式:

int (^myBlock)(int,int);

同樣,你也可以給參數(shù)起名字:

int (^myBlock)(int a,int b);

很多時(shí)候,我們需要將我們聲明的block類型作為函數(shù)的參數(shù),也有一下幾種方式:

1、-(void)func:(int (^)(int a,int b))block;

第二種方式是通過typedef定義一種新的類型,這也是大多數(shù)情況下采用的方式:

2、typedef int (^myBlock)(int a,int b) ;
   -(void)func:(myBlock)block ;

第三種方式也是通過typedef定義,但將blcok包裝重命名成為屬性再調(diào)用,這種思路也更清晰明了

3、typedef void (^myBlock)(int a ,int b);
   @property (nonatomic, strong) myBlcok block;
   -(void)func:(myBlcok)block;

二、如何實(shí)現(xiàn)一個(gè)block
既然block可以被聲明為變量,那么就一定可以實(shí)現(xiàn)它,就像其他類型變量的賦值。我自己對block的理解為它是一斷代碼塊,所以給它賦值賦便是一段代碼段:

typedef int (^myBlock)(int,int) ;
@interface ViewController ()
{    
      myBlock block1;
}
@end
@implementation ViewController
- (void)viewDidLoad {   
    [super viewDidLoad]; 
    block1 =^(int a, int b)
    {        
        return a+b;    
    };   
    NSLog(@"%d",block1(1,1));
}

這里打印的結(jié)果是2,從這里可以發(fā)現(xiàn)block和函數(shù)的功能很像。

注意:1、在上面的代碼里 block1是一個(gè)對象,如果直接打印將打印對象地址
2、block(),加上后面的括號才是執(zhí)行block語句塊
三、block中訪問對象的微妙關(guān)系
1、如果你在一個(gè)block塊中僅僅訪問對象,而不是對他進(jìn)行修改操作,是沒有任何問題的:

- (void)viewDidLoad {   
   [super viewDidLoad]; 
   int tem=2;    
   block1 = ^(int a,int b){        
   int count= tem+1;        
   return count;   
 };   
   NSLog(@"%d",block1(1,1));
}

而如果我在block塊中直接修改,編譯器會(huì)報(bào)錯(cuò):

  block1 = ^(int a,int b){       
     tem+=1;        
     return tem+1;   
 };

為什么會(huì)出現(xiàn)這樣的情況,根據(jù)猜測,可能是block內(nèi)部將訪問的變量都備份了一份,如果我們在內(nèi)部修改,外部的變量并不會(huì)被修改,我們可以通過打印變量的地址來證明這一點(diǎn):

- (void)viewDidLoad {   
 [super viewDidLoad];    
 int tem=2;    
 NSLog(@"%p",&tem);   
 block1 = ^(int a,int b){       
       NSLog(@"%p",&tem);       
       return tem+1;   
 };   
 NSLog(@"%d",block1(1,1)); }

打印結(jié)果如下:


232323.png

可以看出,變量的地址已經(jīng)改變

這是block的簡單聲明是使用的介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Objective-C高級編程》這本書就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 10,085評論 10 69
  • 目錄 Block概述 Block定義方式 Block保存代碼 Block傳值 Block對外部變量的傳遞 Bloc...
    子斌閱讀 1,493評論 2 7
  • 重點(diǎn)掌握 3 類對象和方法 對象就是一個(gè)物體 類的獨(dú)特存在就是一個(gè)實(shí)例,對實(shí)例進(jìn)行操作叫做方法。方法可以應(yīng)用于類或...
    Coder大雄閱讀 1,365評論 0 2
  • 我認(rèn)認(rèn)真真的臨了,雖然不夠完美,但又有何妨…在修心的歷程里一切都是正常!
    小安娘閱讀 315評論 2 6
  • 若有來生 我愿做 秋風(fēng)中的一片落葉 輕輕飄過 不留一絲痕跡 如果有人 從我身邊走過 俯首慢慢將我拾起 我愿用我金色...
    鳶遲閱讀 271評論 0 1

友情鏈接更多精彩內(nèi)容