嘿晰赞,也許你看了題目會覺得我在貶低block? 那你就錯了选侨,大兄die掖鱼!本人也是block的愛好者,能block的情況下絕對不用delegate援制!目前項目是多人合作開發(fā)的時候戏挡,對整體項目代碼進行codereview以及測試的時候,總會因為一些不太合理的block用法晨仑,導(dǎo)致了一系列不可預(yù)估的情況發(fā)生褐墅。所以給大lao們一些介意,在我們iOS開發(fā)過程中洪己,用到block回調(diào)的時候妥凳。一些細節(jié)可能需要注意!
記得加if判斷
可能很多人會看到大部分的時候代碼是這樣的:
if (self.bolck) {
self.block(xxx)
}
其實很多人在想答捕,為什么要寫這層if判斷呢逝钥?
有這么一個應(yīng)用場景,當你發(fā)生block回調(diào)事件之后拱镐,但是你并沒有去接收這個事件艘款,然后你也沒要加這層if判斷持际,于是奔潰就出現(xiàn)了! 是的哗咆,奔潰了蜘欲。所以為了開發(fā)的穩(wěn)定性,加層if很重要晌柬!
在cell里記得用__weakself
其實好多人在用blcok的時候芒填,都是默認使用__weakSelf
。當然空繁,也有人并不是這樣的殿衰,因為現(xiàn)在的編譯器非常強大,會提示你什么時候需要用__weakSelf
盛泡。但是在tableViewCell
里系統(tǒng)是并不會提示你的闷祥,所以這個時候呢,要是沒有__weakSelf
的情況下傲诵,就會發(fā)生循環(huán)引用凯砍,導(dǎo)致這塊內(nèi)存沒辦法釋放。
如果block離有異步回調(diào)或者block拴竹,記得用__strongSelf
是的悟衩,有時候__strongself
也是很重要的,因為如果是異步回調(diào)或者其他的時候栓拜,當前對象已經(jīng)釋放了座泳,也就沒辦法發(fā)生回調(diào)事件了,總會有你意想不到的事情發(fā)生幕与。
名偵探柯南環(huán)節(jié)
嗯挑势,如果單純的運用其實已經(jīng)差不多了,不過身為一個程序員啦鸣,總要有探索的精神潮饱。
blcok在iOS里可以理解為一個匿名函數(shù),oc是一門運行時語言诫给,當一個選擇子SEL
找不到調(diào)用者時香拉,就會發(fā)生balabala一系列的事情之后,還是沒有處理的話就會報錯了中狂。在iOS里如果block回調(diào)發(fā)生卻沒有響應(yīng)者凫碌,那就會報EXC_BAD_ACCESS。如下圖:
第二種情況呢吃型,循環(huán)引用的原因就是因為強引用環(huán)造成的证鸥,關(guān)于此類介紹那就不介紹了僚楞,為什么會發(fā)生呢勤晚,因為我們的Vc對tableview強引用了枉层,tableview對cell可能也進行了強引用?所以就造成了強引用環(huán)赐写!
第三種情況呢鸟蜡,嗨呀,具體看下文吧挺邀!
http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/
其實看了很多東西揉忘,如果感興趣可以看看block源碼,了解它的本質(zhì)端铛,對使用block總有好處的泣矛!
tanks!