Blcok的使用

Block介紹

  • 對象與對象之間的通信方式

  • 代理-協(xié)議劫扒,通知檬洞,Block。

  • 三種通信方式都實現(xiàn)了對象之間的解耦合沟饥。

  • 通知的通信方式是1對多添怔。

  • 代理湾戳、Block是1對1

  • Block介紹

  • Block是iOS4.0之后新增的一種語法結(jié)構(gòu),也稱為“閉包”广料。

  • Block是一個匿名的函數(shù)代碼塊砾脑,此代碼塊可以作為參數(shù)傳遞給其他對象。

  • 可以把block當(dāng)做Objective-C的匿名函數(shù)性昭,block是OC中的一種數(shù)據(jù)類型拦止,^是block的特有標記

  • Block格式說明

  • (返回類型)(^block名稱)(參數(shù)類型)=^(參數(shù)列表){代碼實現(xiàn)};

  • 如果沒有參數(shù)县遣,等號后面參數(shù)列表的()可以省略糜颠。

  • Block的3種類型

  • 不管在ARC還是MRC環(huán)境下,block內(nèi)部如果沒有訪問外部變量萧求,這個block是全局block__NSGlobalBlock__其兴,形式類似函數(shù),存儲在內(nèi)存中的代碼區(qū)夸政。

  • MRC下元旬,block內(nèi)部如果訪問外部變量,這個block是棧block__NSStackBlock__守问,存儲在內(nèi)存中的棧上匀归。

  • MRC下,block內(nèi)部訪問外部變量耗帕,同時對該block做一次copy操作穆端,這個block是堆block__NSMallocBlock__,存儲在內(nèi)存中的堆上仿便。

  • ARC下体啰,block內(nèi)部如果訪問外部變量,這個block是堆block__NSMallocBlock__嗽仪,存儲在內(nèi)存中的堆上荒勇,因為在ARC下,默認對block做了一次copy操作闻坚。

局部變量

局部自動變量沽翔,在Block中可被讀取。Block定義時copy變量的值窿凤,在Block中作為常量使用仅偎,所以即使變量的值在Block外改變,也不影響他在Block中的值卷玉,Block此時對局部變量只是做了值傳遞的操作哨颂。

static 修飾的全局變量

因為全局變量或靜態(tài)變量在內(nèi)存中的地址是固定的,Block在讀取該變量值的時候是直接從其所在內(nèi)存地址讀出相种,獲取到的是最新值威恼,而不是在定義時copy的常量

__block __weak __strong 這都是做什么的

__block 修飾的變量

某些場景下品姓,我們需要在Block內(nèi)部對外部變量進行修改。這時需要使用__block來修飾該變量實現(xiàn)在Block內(nèi)部的修改箫措,此時Block是復(fù)制其引用地址來實現(xiàn)訪問的腹备。

比較__weak 和 __strong

這邊用AFN中的一段代碼

__weak __typeof(self)weakSelf = self;

AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
    __strong __typeof(weakSelf)strongSelf = weakSelf;
    strongSelf.networkReachabilityStatus = status;
    if (strongSelf.networkReachabilityStatusBlock) {
        strongSelf.networkReachabilityStatusBlock(status);
    }
};

__weak

  • 我們在使用Block時,有時候會用到self斤蔓,而Block內(nèi)部對self默認都是強引用植酥。在ARC下,編譯器將Block從棧區(qū)拷貝到堆區(qū)弦牡,Block會強引用和持有self友驮,而self 也會強引用和持有Block,于是就造成了循環(huán)引用驾锰。
  • 此時就需要使用__weak卸留,在修飾變量時,修飾符修飾變量self椭豫,讓 block 不強引用self耻瑟,從而破除循環(huán)。
__weak typeof(self) weakSelf = self;

self.passValueBlock = ^(NSString *string){
    dispatch_async(dispatch_get_main_queue(), ^{
       weakSelf.pointView.startLabel.text = string;
   });
}

弱引用不會影響對象釋放赏酥,當(dāng)一個對象被釋放是喳整,所有指向它的弱引用會被置空,也避免出現(xiàn)野指針裸扶。

__strong

  • 上面提到框都,__weak很好的解決retain Cycle,但還是會存在一些隱患姓言。不知道self什么時候被釋放瞬项,為了保證在Block內(nèi)部不會被釋放,所以使用__strong修飾何荚。
  • Block內(nèi)部對對象采用strong修飾后囱淋,既使原持有對象在block外部已經(jīng)被釋放,但Block內(nèi)部扔能持有餐塘,于是執(zhí)行完Block后妥衣,該對象才被dealloc。
總結(jié):weakSelf是為了Block不持有self戒傻,避免循環(huán)引用税手,而再聲明一個strongSelf是因為一旦進入Block執(zhí)行,就不允許self在這個執(zhí)行過程中釋放需纳。Block執(zhí)行完后這個strongSelf會自動釋放芦倒,沒有循環(huán)引用問題不翩。

最后兵扬,使用Block時的注意事項

  • Block內(nèi)部不能直接修改局部變量

  • Block內(nèi)部可以訪問外部的變量, 默認是將其拷貝到其數(shù)據(jù)結(jié)構(gòu)中來實現(xiàn)訪問的, 屬性是只讀的. Block內(nèi)部不能修改外面的局部變量.

  • 如果要修改需要對要修改的局部變量用__block修飾, 這樣局部變量就可以在Block內(nèi)部修改了麻裳,Block是復(fù)制其引用地址來實現(xiàn)訪問的

  • 當(dāng)Block里面的出現(xiàn)self,造成的循環(huán)引用

  • 循環(huán)引用就是當(dāng)self 擁有一個Block的時候,在Block中又調(diào)用self的方法器钟。形成了你中有我津坑,我中有你,造成誰都無法將誰釋放傲霸。從而發(fā)生內(nèi)存泄漏疆瑰。

解決方法:
__weak typeof (self) weakSelf = self;
  • 定義一個weakSelf變量并加上__weak修飾符,在Block代碼塊中昙啄,所有需要self的地方都用weakSelf來替代穆役。這樣就不會增加引用計數(shù),所以Block持有self對象也就不會造成循環(huán)引用跟衅,從而避免內(nèi)存泄漏孵睬。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末播歼,一起剝皮案震驚了整個濱河市伶跷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秘狞,老刑警劉巖叭莫,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烁试,居然都是意外死亡雇初,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門减响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靖诗,“玉大人,你說我怎么就攤上這事支示】伲” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵颂鸿,是天一觀的道長促绵。 經(jīng)常有香客問我,道長嘴纺,這世上最難降的妖魔是什么败晴? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮栽渴,結(jié)果婚禮上尖坤,老公的妹妹穿的比我還像新娘。我一直安慰自己闲擦,他們只是感情好慢味,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布僚祷。 她就那樣靜靜地躺著,像睡著了一般贮缕。 火紅的嫁衣襯著肌膚如雪辙谜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天感昼,我揣著相機與錄音装哆,去河邊找鬼。 笑死定嗓,一個胖子當(dāng)著我的面吹牛蜕琴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宵溅,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凌简,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恃逻?” 一聲冷哼從身側(cè)響起雏搂,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寇损,沒想到半個月后凸郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡矛市,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年芙沥,在試婚紗的時候發(fā)現(xiàn)自己被綠了浊吏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌憨。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡底桂,死狀恐怖于个,靈堂內(nèi)的尸體忽然破棺而出厅篓,到底是詐尸還是另有隱情羽氮,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匆浙。R本人自食惡果不足惜挑庶,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一抄沮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧率挣,春花似錦、人聲如沸露戒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至动漾,卻和暖如春丁屎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旱眯。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工悦屏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人键思。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓础爬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吼鳞。 傳聞我的和親對象是個殘疾皇子看蚜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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