Block介紹及使用

在實際開發(fā)中顾复,使用Block比delegate和notification更簡潔贡耽。于是在項目中會大量的使用block侄刽。

1执虹、什么是block?

block其實就是一個代碼塊唠梨,將要執(zhí)行的代碼封裝在這個代碼塊里面,等到需要的時候再去調(diào)用侥啤。block也是OC對象当叭,官方文檔如下

image

2茬故、block要用copy修飾,還是用strong

block本身是像對象一樣可以retainrelease。但是蚁鳖,block在創(chuàng)建的時候磺芭,它的內(nèi)存是分配在棧(stack)上,而不是在堆(heap)上醉箕。他本身的作于域是屬于創(chuàng)建時候的作用域钾腺,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導(dǎo)致程序崩潰。

  • 使用retain也可以讥裤,但是blockretain行為默認是用copy的行為實現(xiàn)的放棒,

因為block變量默認是聲明為棧變量的,為了能夠在block的聲明域外使用己英,所以要把block拷貝(copy)到堆间螟,所以說為了讓block屬性聲明和實際的操作一致,最好聲明為copy损肛。

3厢破、__block關(guān)鍵字的使用

Block的代碼塊內(nèi)不可以對外面的變量進行更改的,使用__block就能改變block代碼塊中變量的值

4、__block和__weak有什么區(qū)別治拿?

  • __block不管是ARC還是MRC模式下都可以使用摩泪,可以修飾對象,還可以修飾基本數(shù)據(jù)類型劫谅。
  • __weak只能在ARC模式下使用见坑,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)同波。
  • __block對象可以在block中被重新賦值鳄梅,__weak不可以。

5未檩、Block的使用

@interface BrushViewController : BaseViewController  
@property (nonatomic, copy) void (^getCardInfo)(NSDictionary *cardInfo);  
@end  

block聲明為copy的原因是在代碼塊里面我可能會使用一些本地變量戴尸。而block一開始是放在棧上的,只有copy后才會放到堆上冤狡。
如果不加copy屬性孙蒙,當其所在棧被釋放的時候,這些本地變量將變得不可訪問悲雳。一旦代碼執(zhí)行到block內(nèi)部就會出錯挎峦。

brush.getCardInfo=^(NSDictionary *info){  
    [self test];  
}; 

像上面這段代碼,self是一個本地變量而不是block內(nèi)部變量合瓢,如果聲明為assign坦胶,代碼執(zhí)行到block內(nèi)部就會出錯。
另外一個問題就是self引用計數(shù)會+1。這樣會導(dǎo)致循環(huán)引用顿苇。self持有brush峭咒,brush持有block,block持有self纪岁,結(jié)果就是內(nèi)存泄漏凑队。

解決的辦法如下:

__block CurrentViewController* blockSelf = self;  
brush.getCardInfo=^(NSDictionary *info){  
        [blockSelf test];  
}; 

通過這個方式,告訴block這個變量的引用計數(shù)不要+1幔翰。
(__blockARCMRC均可以使用漩氨,__weak只能在ARC下使用)
如果你使用的是ARC,那么就應(yīng)該改成下面這樣:

__weak CurrentViewController* blockSelf = self;  
brush.getCardInfo=^(NSDictionary *info){  
        [blockSelf test];  
};  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遗增,一起剝皮案震驚了整個濱河市叫惊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贡定,老刑警劉巖赋访,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缓待,居然都是意外死亡蚓耽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門旋炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步悠,“玉大人,你說我怎么就攤上這事瘫镇《κ蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵铣除,是天一觀的道長谚咬。 經(jīng)常有香客問我,道長尚粘,這世上最難降的妖魔是什么择卦? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮郎嫁,結(jié)果婚禮上秉继,老公的妹妹穿的比我還像新娘。我一直安慰自己泽铛,他們只是感情好尚辑,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盔腔,像睡著了一般杠茬。 火紅的嫁衣襯著肌膚如雪月褥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天澈蝙,我揣著相機與錄音吓坚,去河邊找鬼。 笑死灯荧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盐杂。 我是一名探鬼主播逗载,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼链烈!你這毒婦竟也來了厉斟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤强衡,失蹤者是張志新(化名)和其女友劉穎擦秽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漩勤,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡感挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了越败。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片触幼。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖究飞,靈堂內(nèi)的尸體忽然破棺而出置谦,到底是詐尸還是另有隱情,我是刑警寧澤亿傅,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布媒峡,位于F島的核電站,受9級特大地震影響葵擎,放射性物質(zhì)發(fā)生泄漏谅阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一坪蚁、第九天 我趴在偏房一處隱蔽的房頂上張望奔穿。 院中可真熱鬧,春花似錦敏晤、人聲如沸贱田。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽男摧。三九已至蔬墩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耗拓,已是汗流浹背拇颅。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乔询,地道東北人樟插。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像竿刁,于是被迫代替她去往敵國和親黄锤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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