IOS中的 Block 初步了解

對于Block的理解

block是對象挪鹏,它封裝了一段代碼,這段代碼可以在任何時候執(zhí)行愉烙。block可以作為函數(shù)參數(shù)或者函數(shù)的返回值讨盒,而其本身又可以帶輸入?yún)?shù)或返回值。


一.聲明Block變量

返回值(^block名)(參數(shù));

//返回值為int類型參數(shù)為int類型的block

int(^blockName)(int,int);

//返回值為int類型參數(shù)為int類型的block給參數(shù)起名字

int(^blockName)(inta,intb);

//當(dāng)我們需要將block作為函數(shù)參數(shù)時的兩種方式

1.- (void)函數(shù)名:(int(^)(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2))block;

2.typedefint(^myBlock)(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2);

- (void)函數(shù)名:(myBlock)block;

在OC中也可以在.h文件中@property一個block

@property(nonatomic, copy)void(^blockName) (參數(shù)類型*參數(shù)名);


二.實現(xiàn)Block

既然block可以被聲明為變量步责,那么就一定可以實現(xiàn)它返顺,就像其他類型變量的賦值。

對于block可以把它理解成是一斷代碼塊蔓肯,給它賦值便是一段代碼段:

//聲明block

typedefint(^myBlock)(int,int);

@interfaceViewController ()

{

//創(chuàng)建一個myBlock類型的實例對象block1

myBlock block1;

}

@end

@implementationViewController

- (void)viewDidLoad {

[superviewDidLoad];

block1 =^(inta,intb){

returna+b;

};

NSLog(@"%d",block1(1,1));

}

注意:1遂鹊、在上面的代碼里block1是一個對象,如果直接打印將打印對象地址

2省核、block()稿辙,加上后面的括號才是執(zhí)行block語句塊

-----------------------------------------------------------------------------------------------------

三. block訪問對象的微妙關(guān)系

1、如果你在一個block塊中僅僅訪問對象气忠,而不是對他進行修改操作邻储,是沒有任何問題的:

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

inttem=2;

block1 = ^(inta,intb){

intcount= tem+1;

returncount;

};

NSLog(@"%d",block1(1,1));

}

而如果我在block塊中直接修改,編譯器會報錯:

block1 = ^(inta,intb){

tem+=1;//報錯

returntem+1;

};

為什么會出現(xiàn)這樣的情況旧噪,根據(jù)猜測吨娜,可能是block內(nèi)部將訪問的變量都備份了一份,如果我們在內(nèi)部修改淘钟,外部的變量并不會被修改宦赠,我們可以通過打印變量的地址來證明這一點:

- (void)viewDidLoad {

[superviewDidLoad];

inttem=2;

NSLog(@"%p",&tem);

block1 = ^(inta,intb){

NSLog(@"%p",&tem);

returntem+1;

};

NSLog(@"%d",block1(1,1));

}

打印出的地址改變了

// ? ?*所以根據(jù)上面的代碼就可以解釋為什么@property聲明block //的時候要用copy了

// ? ? ? ?block內(nèi)部會把訪問的變量備份一遍

2.__block有什么作用,做了什么?

為了可以在block塊中訪問并修改外部變量,我們常會把變量聲明成__block類型,通過上面的原理勾扭,可以發(fā)現(xiàn)毡琉,其實這個關(guān)鍵字只做了一件事

如果在block中訪問沒有添加這個關(guān)鍵字的變量,會訪問到block自己拷貝的那一份變量妙色,它是在block創(chuàng)建的時候創(chuàng)建的桅滋,而訪問加了這個關(guān)鍵字的變量,則會訪問這個變量的地址所對應(yīng)的變量身辨。我們可以通過代碼來證明:

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

inttem=2;

block1 = ^(inta,intb){

returntem+a+b;

};

tem=4;

NSLog(@"%d",block1(1,1));

block1 = ^(inta,intb){

returntem+a+b;

};

__blockinttem2=2;

tem2=4;

NSLog(@"%d",block1(1,1));

}

運行結(jié)果:4

6

由此丐谋,我們可以理解,如果block中操作的對象是指針煌珊,那么直接可以進行修改号俐,這包括OC對象,如果不是定庵,則需要用__block關(guān)鍵字修飾吏饿。

4、關(guān)于引用計數(shù)

在block中訪問的對象蔬浙,會默認retain:

而添加__block的對象不會被retain;

注意:如果我們訪問類的成員變量找岖,或者通過類方法來訪問對象,那么這些對象不會被retain敛滋,而類對象會被return许布,最常見的時self:


四.關(guān)于block的作用域

應(yīng)避免將花括號中的block用于外面,如果需要绎晃,你可以將這個block聲明為全局的蜜唾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市庶艾,隨后出現(xiàn)的幾起案子袁余,更是在濱河造成了極大的恐慌,老刑警劉巖咱揍,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颖榜,死亡現(xiàn)場離奇詭異,居然都是意外死亡煤裙,警方通過查閱死者的電腦和手機掩完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硼砰,“玉大人且蓬,你說我怎么就攤上這事√夂玻” “怎么了恶阴?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵诈胜,是天一觀的道長。 經(jīng)常有香客問我冯事,道長焦匈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任昵仅,我火速辦了婚禮括授,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岩饼。我一直安慰自己,他們只是感情好薛夜,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布籍茧。 她就那樣靜靜地躺著,像睡著了一般梯澜。 火紅的嫁衣襯著肌膚如雪寞冯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天晚伙,我揣著相機與錄音吮龄,去河邊找鬼。 笑死咆疗,一個胖子當(dāng)著我的面吹牛漓帚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播午磁,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼尝抖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迅皇?” 一聲冷哼從身側(cè)響起昧辽,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎登颓,沒想到半個月后搅荞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡框咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年咕痛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇嘱。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡暇检,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婉称,到底是詐尸還是另有隱情块仆,我是刑警寧澤构蹬,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站悔据,受9級特大地震影響庄敛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜科汗,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一藻烤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧头滔,春花似錦怖亭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至早歇,卻和暖如春倾芝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箭跳。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工晨另, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谱姓。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓借尿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屉来。 傳聞我的和親對象是個殘疾皇子垛玻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,331評論 2 26
  • 原文地址:Objective-C中的Block 1.相關(guān)概念 在這篇筆記開始之前,我們需要對以下概念有所了解奶躯。 1...
    默默_David閱讀 405評論 0 1
  • 前言 Blocks是C語言的擴充功能帚桩,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,757評論 0 23
  • Block使用場景,可以在兩個界面的傳值嘹黔,也可以對代碼封裝作為參數(shù)的傳遞等账嚎。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 718評論 2 1
  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)儡蔓、block郭蕉、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,796評論 10 69