iOS-Block使用及注意點(diǎn)

Block定義

塊與函數(shù)相似缤削,是可以獲取其他函數(shù)局部變量的匿名函數(shù)涝婉。

Block寫法

(1) 無參數(shù)
void(^block名)() = ^{代碼塊};

(2)有參數(shù)
void (^block名稱)(參數(shù)列表) = ^(參數(shù)列表) { 代碼實(shí)現(xiàn)};

(3)有參數(shù) 和 返回值 的
返回類型 (^block 名稱)(參數(shù)列表) = ^(參數(shù)列表){代碼實(shí)現(xiàn)};

(4)調(diào)用block保存的代碼
block變量名(實(shí)參);
(5)typedef簡化Block的聲明、作為屬性
聲明:typedef return_type (^BlockTypeName)(var_type);
屬性: @property (nonatomic, copy) BlockTypeName blockTypeName;

Block應(yīng)用場景

1.響應(yīng)事件
2.傳遞數(shù)據(jù)
如果block訪問的外部變量是局部變量榆骚,那么就是值傳遞棠涮,外界改了臀稚,不會(huì)影響里面
如果block訪問的外部變量是__block或者static修飾崭闲,或者是全局變量肋联,那么就是指針傳遞,block里面的值和外界同一個(gè)變量刁俭,外界改變橄仍,內(nèi)部也改變;

Block內(nèi)存管理

(1)無論當(dāng)前環(huán)境是ARC 還是 MRC牍戚,只要block沒有訪問外部變量侮繁,block始終在全局區(qū);
(2)MRC情況下:
1.block如果訪問外部變量如孝,block在棧里
2.不能對(duì)block使用retain宪哩,否則不能保存在堆里
3.只有使用copy,才能放到堆里
ARC情況下:
1.block如果訪問外部變量第晰,block在堆里
2.block可以使用copy和strong锁孟,并且block是一個(gè)對(duì)象

Block注意事項(xiàng)

(1)Block可以訪問外部變量(局部變量不能修改)但是可以改變?nèi)肿兞俊㈧o態(tài)變量茁瘦、全局靜態(tài)變量品抽;
(2)如果需要在block內(nèi)部修改局部變量的值,使用__block修飾符外部變量甜熔;
(3)在block內(nèi)部使用外部指針會(huì)造成循環(huán)引用圆恤,需要使用__weak修飾外部指針
__weak typeof(self) weakSelf = self;
使用__weak,也會(huì)有一個(gè)隱患腔稀,在block內(nèi)部如果調(diào)用了延時(shí)函數(shù)還使用弱指針會(huì)娶不到該指針盆昙,因?yàn)橐呀?jīng)被銷毀了,為了保證在block內(nèi)不會(huì)被釋放焊虏,我們添加__strong淡喜。更多的時(shí)候需要配合strongSelf使用:
__weak typeof(self) weakSelf = self;
self.testBlock = ^{
__strong __typeof(weakSelf) strongSelf = weakSelf;
[strongSelf test];
});

Block傳值

有兩個(gè)視圖控制器 A 和 B,現(xiàn)在點(diǎn)擊 A 上的按鈕跳轉(zhuǎn)到視圖 B 诵闭,并在 B 中的textfield 輸入字符串拆火,點(diǎn)擊 B 中的跳轉(zhuǎn)按鈕跳轉(zhuǎn)回 A ,并將之前輸入的字符串顯示在 A 中的 label 上涂圆。也就是說 A 視圖中需要回調(diào) B 視圖中的數(shù)據(jù)们镜。
BViewController.h代碼:
typedef void(^CallBackBlcok) (NSString *text);
@interface BViewController : UIViewController
@property (nonatomic,copy)CallBackBlcok callBackBlock;
@end
BViewController.m代碼:

  • (IBAction)click:(id)sender {
    self.callBackBlock(_textField.text);
    [self.navigationController popToRootViewControllerAnimated:YES];
    }

AViewController.m代碼:

  • (IBAction)push:(id)sender {
    BViewController *bVC = [BViewController alloc]init];
    __weak AViewController *weakSelf = self;
    bVC.callBackBlock = ^(NSString *text){
    NSLog(@"text is %@",text);
    weakSelf.label.text = text;
    };
    [self.navigationController pushViewController:bVC animated:YES];
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市润歉,隨后出現(xiàn)的幾起案子模狭,更是在濱河造成了極大的恐慌,老刑警劉巖踩衩,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚼鹉,死亡現(xiàn)場離奇詭異贩汉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锚赤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門匹舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人线脚,你說我怎么就攤上這事赐稽。” “怎么了浑侥?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵姊舵,是天一觀的道長。 經(jīng)常有香客問我寓落,道長括丁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任伶选,我火速辦了婚禮史飞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰税。我一直安慰自己构资,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布肖卧。 她就那樣靜靜地躺著蚯窥,像睡著了一般掸鹅。 火紅的嫁衣襯著肌膚如雪塞帐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天巍沙,我揣著相機(jī)與錄音葵姥,去河邊找鬼。 笑死句携,一個(gè)胖子當(dāng)著我的面吹牛榔幸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮嫉,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼削咆,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了蠢笋?” 一聲冷哼從身側(cè)響起拨齐,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨寞,沒想到半個(gè)月后瞻惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厦滤,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年歼狼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掏导。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羽峰,死狀恐怖趟咆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情限寞,我是刑警寧澤忍啸,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站履植,受9級(jí)特大地震影響计雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫霎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一凿滤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶近,春花似錦翁脆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉钥,卻和暖如春罢缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投队。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工枫疆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷鸦。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓息楔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扒披。 傳聞我的和親對(duì)象是個(gè)殘疾皇子值依,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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