Block是個(gè)好東西

前言:Block從會(huì)用俱济,到理解,到頓悟债蜜;清新的簡書晴埂,記錄清楚的簡述。


不說block你看我就夠了-寻定。-

iOSer英語是不應(yīng)該成為攔路虎的水果官方block文檔

第一部分儒洛,定義和使用block

- (void)viewDidLoad

{

[super?viewDidLoad];

//(1)定義無參無返回值的Block

void(^printBlock)()?=?^(){

printf("no?number");

};

- (void)viewDidLoadprintBlock();

printBlock(9);

intmutiplier?=?7;

//(3)定義名為myBlock的代碼塊,返回值類型為int

int(^myBlock)(int)?=?^(intnum){

returnnum*mutiplier;

}

//使用定義的myBlock

intnewMutiplier?=?myBlock(3);

printf("newMutiplier?is?%d",myBlock(3));

}

//定義在-viewDidLoad方法外部

//(2)定義一個(gè)有參數(shù)狼速,沒有返回值的Block

void(^printNumBlock)(int)?=?^(intnum){

printf("int?number?is?%d",num);

};

{

[super viewDidLoad];

//(1)定義無參無返回值的Block

void (^printBlock)() = ^(){

printf("no number");

};

printBlock();

printBlock(9);

int mutiplier = 7;

//(3)定義名為myBlock的代碼塊琅锻,返回值類型為int

int (^myBlock)(int) = ^(int num){

return num*mutiplier;

}

//使用定義的myBlock

int newMutiplier = myBlock(3);

printf("newMutiplier is %d",myBlock(3));

}

//定義在-viewDidLoad方法外部

//(2)定義一個(gè)有參數(shù),沒有返回值的Block

void (^printNumBlock)(int) = ^(int num){

printf("int number is %d",num);

};

定義Block變量向胡,就相當(dāng)于定義了一個(gè)函數(shù)恼蓬。但是區(qū)別也很明顯,因?yàn)楹瘮?shù)肯定是在-viewDidLoad方法外面定義僵芹,而Block變量定義在了viewDidLoad方法內(nèi)部处硬。當(dāng)然,我們也可以把Block定義在-viewDidLoad方法外部淮捆,例如上面的代碼塊printNumBlock的定義郁油,就在-viewDidLoad外面。

再來看看上面代碼運(yùn)行的順序問題攀痊,以第(3)個(gè)myBlock距離來說桐腌,在定義的地方,并不會(huì)執(zhí)行Block{}內(nèi)部的代碼苟径,而在myBlock(3)調(diào)用之后才會(huì)執(zhí)行其中的代碼案站,這跟函數(shù)的理解其實(shí)差不多,就是只要在調(diào)用Block(函數(shù))的時(shí)候才會(huì)執(zhí)行Block體內(nèi)(函數(shù)體內(nèi))的代碼棘街。所以上面的簡單代碼示例蟆盐,我可以作出如下的結(jié)論,

(1)在類中遭殉,定義一個(gè)Block變量石挂,就像定義一個(gè)函數(shù);

(2)Block可以定義在方法內(nèi)部险污,也可以定義在方法外部痹愚;

(3)只有調(diào)用Block時(shí)候,才會(huì)執(zhí)行其{}體內(nèi)的代碼蛔糯;

(PS:關(guān)于第(2)條拯腮,定義在方法外部的Block,其實(shí)就是文件級(jí)別的全局變量)

那么在類中定義一個(gè)Block蚁飒,特別是在-viewDidLoad方法體內(nèi)定義一個(gè)Block到底有什么意義呢动壤?我表示這時(shí)候只把它當(dāng)做私有函數(shù)就可以了。我之前說過淮逻,Block其實(shí)就相當(dāng)于代理琼懊,那么這時(shí)候我該怎樣將其與代理類比以了解呢。這時(shí)候我可以這樣說:本類中的Block就相當(dāng)于類自己服從某個(gè)協(xié)議爬早,然后讓自己代理自己去做某個(gè)事情肩碟。很拗口吧?看看下面的代碼凸椿,

//定義一個(gè)協(xié)議

@protocol?ViewControllerDelegate

-?(void)selfDelegateMethod;

@end

//本類實(shí)現(xiàn)這個(gè)協(xié)議ViewControllerDelegate

@interface?ViewController?()

@property?(nonatomic,?assign)?id?delegate;

@end

接著在-viewDidLoad中的代碼如下削祈,


- (void)viewDidLoad

{

[super?viewDidLoad];

//?Do?any?additional?setup?after?loading?the?view?from?its?nib.

self.delegate?=?self;

if(self.delegate?&&?[self.delegate?respondsToSelector:@selector(selfDelegateMethod)])?{

[self.delegate?selfDelegateMethod];

}

}

#pragma?mark?-?ViewControllerDelegate?method

//實(shí)現(xiàn)協(xié)議中的方法

-?(void)selfDelegateMethod

{

NSLog(@"自己委托自己實(shí)現(xiàn)的方法");

}


代理形象說:

nextController姑且稱為B

ViewController姑且稱為A

B說:我這里有錢(你需要的值)但是你們誰要的話必須遵守我的規(guī)則(協(xié)議)

并且按照我的規(guī)定(協(xié)議)去做一些事情(實(shí)現(xiàn)方法)


第二部分:

__block關(guān)鍵字的使用

在Block的{}體內(nèi),是不可以對(duì)外面的變量進(jìn)行更改的脑漫,比如下面的語句髓抑,


- (void)viewDidLoad

{

//將Block定義在方法內(nèi)部

intx?=?100;

void(^sumXAndYBlock)(int)?=?^(inty){

x?=?x+y;

printf("new?x?value?is?%d",x);

};

sumXAndYBlock(50);

}


這樣是修改不了x的值的,如果你想在block里面修改外部的值的話

你需要這樣

__block intx = 100;


第三部分:

把block作為參數(shù)优幸,在頁面之間穿梭吧

Block作為property屬性實(shí)現(xiàn)頁面之間傳值


需求:在ViewController中吨拍,點(diǎn)擊Button,push到下一個(gè)頁面NextViewController网杆,在NextViewController的輸入框TextField中輸入一串字符羹饰,返回的時(shí)候伊滋,在ViewController的Label上面顯示文字內(nèi)容,

(1)第一種方法:首先看看通過“協(xié)議/代理”是怎么實(shí)現(xiàn)兩個(gè)頁面之間傳值的吧队秩,

//NextViewController是push進(jìn)入的第二個(gè)頁面

//NextViewController.h?文件

//定義一個(gè)協(xié)議笑旺,前一個(gè)頁面ViewController要服從該協(xié)議,并且實(shí)現(xiàn)協(xié)議中的方法

@protocol?NextViewControllerDelegate?

-?(void)passTextValue:(NSString?*)tfText;

@end

@interface?NextViewController?:?UIViewController

@property?(nonatomic,?assign)?id?delegate;

@end

//NextViewController.m?文件

//點(diǎn)擊Button返回前一個(gè)ViewController頁面

-?(IBAction)popBtnClicked:(id)sender?{

if(self.delegate?&&?[self.delegate?respondsToSelector:@selector(passTextValue:)])?{

//self.inputTF是該頁面中的TextField輸入框

[self.delegate?passTextValue:self.inputTF.text];

}

[self.navigationController?popViewControllerAnimated:YES];

}

接下來我們在看看ViewController文件中的內(nèi)容馍资,


//ViewController.m 文件

@interface?ViewController?()

@property?(strong,?nonatomic)?IBOutlet?UILabel?*nextVCInfoLabel;

@end

//點(diǎn)擊Button進(jìn)入下一個(gè)NextViewController頁面

-?(IBAction)btnClicked:(id)sender

{

NextViewController?*nextVC?=?[[NextViewController?alloc]?initWithNibName:@"NextViewController"bundle:nil];

nextVC.delegate?=?self;//設(shè)置代理

[self.navigationController?pushViewController:nextVC?animated:YES];

}

//實(shí)現(xiàn)協(xié)議NextViewControllerDelegate中的方法

#pragma?mark?-?NextViewControllerDelegate?method

-?(void)passTextValue:(NSString?*)tfText

{

//self.nextVCInfoLabel是顯示NextViewController傳遞過來的字符串Label對(duì)象

self.nextVCInfoLabel.text?=?tfText;

}

這是通過“協(xié)議/代理”來實(shí)現(xiàn)的兩個(gè)頁面之間傳值的方式筒主。

(2)第二種方法:使用Block作為property,實(shí)現(xiàn)兩個(gè)頁面之間傳值鸟蟹,

先看看NextViewController文件中的內(nèi)容乌妙,

//NextViewController.h 文件

@interface?NextViewController?:?UIViewController

@property?(nonatomic,?copy)void(^NextViewControllerBlock)(NSString?*tfText);

@end

//NextViewContorller.m?文件

-?(IBAction)popBtnClicked:(id)sender?{

if(self.NextViewControllerBlock)?{

self.NextViewControllerBlock(self.inputTF.text);

}

[self.navigationController?popViewControllerAnimated:YES];

}

再來看看ViewController文件中的內(nèi)容,


- (IBAction)btnClicked:(id)sender

{

NextViewController?*nextVC?=?[[NextViewController?alloc]?initWithNibName:@"NextViewController"bundle:nil];

nextVC.NextViewControllerBlock?=?^(NSString?*tfText){

[self?resetLabel:tfText];

};

[self.navigationController?pushViewController:nextVC?animated:YES];

}

#pragma?mark?-?NextViewControllerBlock?method

-?(void)resetLabel:(NSString?*)textStr

{

self.nextVCInfoLabel.text?=?textStr;

}

- 建钥。-完事兒藤韵,干活兒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熊经,一起剝皮案震驚了整個(gè)濱河市荠察,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈搜,老刑警劉巖悉盆,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馋吗,居然都是意外死亡焕盟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宏粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脚翘,“玉大人,你說我怎么就攤上這事绍哎±磁” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵崇堰,是天一觀的道長沃于。 經(jīng)常有香客問我,道長海诲,這世上最難降的妖魔是什么繁莹? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮特幔,結(jié)果婚禮上咨演,老公的妹妹穿的比我還像新娘。我一直安慰自己蚯斯,他們只是感情好薄风,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布饵较。 她就那樣靜靜地躺著,像睡著了一般遭赂。 火紅的嫁衣襯著肌膚如雪循诉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天嵌牺,我揣著相機(jī)與錄音打洼,去河邊找鬼龄糊。 笑死逆粹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炫惩。 我是一名探鬼主播僻弹,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼他嚷!你這毒婦竟也來了蹋绽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤筋蓖,失蹤者是張志新(化名)和其女友劉穎卸耘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘咖,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚣抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓮下。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰铡。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讽坏,靈堂內(nèi)的尸體忽然破棺而出锭魔,到底是詐尸還是另有隱情,我是刑警寧澤路呜,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布迷捧,位于F島的核電站,受9級(jí)特大地震影響胀葱,放射性物質(zhì)發(fā)生泄漏党涕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一巡社、第九天 我趴在偏房一處隱蔽的房頂上張望膛堤。 院中可真熱鬧,春花似錦晌该、人聲如沸肥荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燕耿。三九已至中符,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間誉帅,已是汗流浹背淀散。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚜锨,地道東北人档插。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亚再,于是被迫代替她去往敵國和親郭膛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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

  • 總結(jié): block本質(zhì)是指向一個(gè)結(jié)構(gòu)體的一個(gè)指針運(yùn)行時(shí)機(jī)制 比較高級(jí)的特性 純C語言,平時(shí)寫的OC代碼 轉(zhuǎn)換成C語...
    JonesCxy閱讀 402評(píng)論 5 0
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉氛悬,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評(píng)論 0 9
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評(píng)論 30 470
  • 小一萬從奶奶家回來如捅,車馬勞頓棍现,還是做了這頓簡餐。 伙食镜遣,我們不需要吃的多好己肮,吃的有味道就是好伙食。 早上小一萬床上...
    007寫了自己的生活閱讀 528評(píng)論 2 5
  • 《獵場》的人物故事發(fā)展總是讓姐意外戈稿。 用一句話概括最近的鄭秋冬——伊人在水一方,青春總會(huì)離場讶舰,衣玫蛻變上位鞍盗,真心“...
    娛樂拆穿姐閱讀 664評(píng)論 0 0