淺談block

Block.jpg

這道題目,很多人會認為6,但是答案是3, 其實這邊和block關(guān)系并不大,主要還是num++++num之間的差別,C語言里的基礎(chǔ),num++是返回后自增,而++num是自增后返回。Ok,這不重要,我把這道題目發(fā)群里后,大家開始了一波討論,首先,有人提出,如果把num用__block修飾,那輸出肯定是6了,

__block.jpg

But,輸出依舊是3,那人懵逼了,仔細一想,應該這么改:
__block.jpg

這樣的話,結(jié)果就不一樣了,很顯然,這涉及到block的一些知識。

一:Block的分類

1.NSStackBlock:棧block
2.NSMallocBlock:堆block
3.NSGlobalBlock:全局block

二:Block對外界變量的獲取

1.基本數(shù)據(jù)類型:局部變量
block會拷貝該變量的常量使用,外界修改的值不會影響block內(nèi)部,并且block內(nèi)部不能對其修改。
block內(nèi)部修改外界變量的值會error,這個歌時候可以在前面加上__block修飾,這個變量相當于全局變量和靜態(tài)變量。

int a = 0;
void (^block1)() = ^ {
    //        a++ 直接修改a會報錯
    NSLog(@"a = %d",a);
};
a++;
block1(); //輸出結(jié)果 a = 0;

__block int b = 0;
void (^block2) () = ^ {
    NSLog(@"block print b = %d",b); // 輸出結(jié)果 b = 0;
    b = 2;
};
block2();
NSLog(@"out print b = %d",b); //輸出結(jié)果 b = 2;

2.基本數(shù)據(jù)類型成員變量(實例變量),靜態(tài)變量,全局變量
block直接訪問變量地址,在block內(nèi)部可以修改變量的值,并且變量被改變后,block內(nèi)部也會隨著改變。

self.num = 1;
self.num ++;
void (^block3) () = ^ {
    self.num++;
};
block3();
NSLog(@"%d",self.num);//輸出結(jié)果為 3

3.指針類型: 成員變量(實例變量),靜態(tài)變量,全局變量
block會復制一份指針并強引用指針所指對象,且內(nèi)部不能修改指針的指向,但是可以修改指針所指向?qū)ο蟮闹担?/p>

static NSString *staticStr = @"abc";
void (^block5) () = ^{
    NSLog(@"staticStr = %@",staticStr);
    staticStr = @"def";
    NSLog(@"staticStr = %@",staticStr);
};
staticStr = @"123";
block5();

所以說,對于開頭題目的討論,之所以是3是因為他只是拷貝了變量的常量,即使對其進行__block修飾,也是不會改變,除非是將__block修飾的變量直接修改,才會引起block內(nèi)部的和變量的值的改變。

結(jié)束語

謝謝閱讀,一起學習,本人也是出于交流學習,怕自己忘記,寫的文章~

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

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

  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 823評論 2 1
  • 前言 block的具體怎么使用我在這里就不一一細說, 我主要說的是關(guān)于block三種類型之間的區(qū)別, 以及blo...
    夢里桃花舞傾城閱讀 236評論 0 0
  • 1. iOS Block用來封裝一段代碼塊或者傳遞參數(shù)相對于代理使用起來方便,它本質(zhì)上是一個匿名函數(shù)。 2.使用b...
    extanstory閱讀 383評論 0 0
  • 摘要block是2010年WWDC蘋果為Objective-C提供的一個新特性,它為我們開發(fā)提供了便利,比如GCD...
    西門吹雪123閱讀 1,002評論 0 4
  • Block 是什么?Block 是一個匿名的函數(shù),但是它能夠捕獲變量,這是它跟匿名函數(shù)的區(qū)別。 Block 是如何...
    jeff_guan閱讀 478評論 0 0

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