理解block(塊)

block的結(jié)構(gòu)

block結(jié)構(gòu)圖
block結(jié)構(gòu)圖
return_type (^block_name)(paratemters)

block的基本用法

int additional = 5;
int (^addBlock)(int a, int b) = ^(int a, int b){
    return a + b+ addition;
}

默認(rèn)情況下夺衍,為block所捕獲的變量狈谊,是不可以在塊里修改的(需要加__block)

NSArray *array = @[@0, @1, @2, @3, @4, @5];

__block int count = 0;
   
[array enumerateObjectsUsingBlock:^(NSNumber *number, NSUInteger idx, BOOL *stop) {
       
       if ([number compare:@2] == NSOrderedAscending) {
           
           count ++;
       }
   }];
   
//    count = 2;

塊總能修改實例變量,所以在聲明時無需加__block

在定義blcok的時候沟沙,所占內(nèi)存分配的棧中的河劝,這就是說,塊只在定義他的那個范圍內(nèi)有效

一下代碼就很危險

void (^block)();
    
if (count == 2) {
    
    block = ^{
        
        NSLog(@"Block A");
        
    };
}else{
    
     block = ^{
        
        NSLog(@"Block B");

}

block();

首先棧內(nèi)存是分配是有編譯器分配和釋放的矛紫,以上代碼中if和else中的block被分配到棧內(nèi)存中(這兩個塊只能保證在對應(yīng)的if或else語句范圍內(nèi)有效)赎瞎,如果編譯器把分配給block的內(nèi)存給覆寫掉,那么程序就會崩潰颊咬。
注意:對于棧來講务甥,是由編譯器自動管理,無需我們手工控制喳篇;對于堆來講敞临,釋放工作有程序員控制,容易產(chǎn)生memory Leak麸澜。
為解決以上問題挺尿,我們可以給block對象發(fā)送copy消息,把block從棧復(fù)制到堆上。

void (^block)();
 
if (count == 2) {
 
     [block = ^{
         
         NSLog(@"Block A");
         
     } copy];
}else{
 
     [block  =^{
     
      NSLog(@"Block B");
        
     } copy];

}

block();

全局塊

可以把塊定義為全局變量编矾,在文件級別上使用熟史。全局塊可以聲明到全局內(nèi)存中,而不需要在每次用到得時候于棧中創(chuàng)建窄俏。另外全局塊的copy是個空操作以故,因為全局塊絕不可能為系統(tǒng)所回收。

block一般有三種裆操,NSConcreteGlobal, NSConcreteStack, NSConcreteMalloc怒详。
block是可以訪問block外部的變量的。
NSConcreteGlobal: 就像一個全局函數(shù)一樣踪区,從頭到尾待在那昆烁,始終是可用的。當(dāng)Block中沒有引用外部變量時缎岗,block為global類型的静尼。
NSConcreteStack: 保存在棧中的block,block執(zhí)行完后內(nèi)存會被釋放掉传泊。當(dāng)block引用了外部變量時鼠渺,block為stack類型的。
NSConcreteMallock: 保存在堆中的block眷细,block為引用記數(shù)為0時拦盹,內(nèi)存會被釋放掉。當(dāng)block執(zhí)行copy時溪椎,block會從棧中復(fù)制到堆中普舆。
以上都針對非ARC環(huán)境而言,如果在ARC環(huán)境下校读,引用外部變量的block會自動保存在堆中沼侣,無需copy。

待續(xù)歉秫。蛾洛。。

block的理解http://answerhuang.duapp.com/index.php/2013/09/07/objective-c-blocks-syntax/#carousel-generic-38

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雁芙,一起剝皮案震驚了整個濱河市轧膘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌却特,老刑警劉巖扶供,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筛圆,死亡現(xiàn)場離奇詭異裂明,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門闽晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扳碍,“玉大人,你說我怎么就攤上這事仙蛉∷癯ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵荠瘪,是天一觀的道長夯巷。 經(jīng)常有香客問我,道長哀墓,這世上最難降的妖魔是什么趁餐? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮篮绰,結(jié)果婚禮上后雷,老公的妹妹穿的比我還像新娘。我一直安慰自己吠各,他們只是感情好臀突,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贾漏,像睡著了一般候学。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵散,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天盒齿,我揣著相機與錄音,去河邊找鬼困食。 笑死边翁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硕盹。 我是一名探鬼主播符匾,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘩例!你這毒婦竟也來了啊胶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤垛贤,失蹤者是張志新(化名)和其女友劉穎焰坪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聘惦,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡某饰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔漂。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡诫尽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炬守,到底是詐尸還是另有隱情牧嫉,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布减途,位于F島的核電站酣藻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳍置。R本人自食惡果不足惜臊恋,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墓捻。 院中可真熱鬧抖仅,春花似錦、人聲如沸砖第。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧兼。三九已至放吩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羽杰,已是汗流浹背渡紫。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留考赛,地道東北人惕澎。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像颜骤,于是被迫代替她去往敵國和親唧喉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容