bolck塊

//bolck:一塊代碼.聲明block類型的指針是指向一塊代碼,而不是一個對象

//block:閉包和匿名函數(shù)在OC中的實現(xiàn)

創(chuàng)建類型有多種:

1.無返回值無參數(shù)

2.無返回值有參數(shù)

3.有返回值有參數(shù)(有返回值要接收)

創(chuàng)建方式有3種: ??格式:(變量名)(參數(shù))

1.聲明和創(chuàng)建分開 ?調(diào)用時必須有()

//第一種方式:聲明一個無參數(shù)無返回值類型的block指針

//1.1聲明和創(chuàng)建分開block

void(^block1)(void);

//創(chuàng)建一個block (無參數(shù)無返回值類型的block)

block1 = ^(void){

//block的創(chuàng)建就類似于方法,同樣只有調(diào)用才會執(zhí)行block塊中的代碼

NSLog(@"***我執(zhí)行了***");

};

//block調(diào)用----即沒有參數(shù)必須加()

block1();

//1.2聲明和創(chuàng)建一起

//注意:當我們的參數(shù)為void的時候,聲明可以忽略聲明中的void,創(chuàng)建時可以省略(void)

void(^block2)() = ^{

NSLog(@"---我是一個省略(void)參數(shù)的block");

};

block2();

//1.3:宏定義方式

MyBlock blocck3;

blocck3 = ^ {

NSLog(@"我是重定義的");

};

blocck3();

2.聲明和創(chuàng)建一起 (注意:當我們的參數(shù)為void的時候,聲明可以忽略聲明中的void,創(chuàng)建可以忽略(void))

//第二種方式:有一個參數(shù)無返回值類型的block指針

void(^block4)(int a,int b);//等價于void (^block4)(int ,int )

block4 = ^(int a,int b){

NSLog(@"%d + %d = %d",a,b,a+b);

};

block4(1,3);

//多個參數(shù)之間逗號隔開

Plus block5 = ^(int a,int b){

NSLog(@"從定義后的加法%d+%d=%d",a,b,a+b);

};

block5(3,4);

3.宏定義方式:在接口之前聲明

typedef void(^別名)(參數(shù),參數(shù))

//給數(shù)據(jù)類型起別名----定義一個新的數(shù)據(jù)類型

//1.寫像聲明一個變量的代碼

//2.將變量名改為你想要的別名

//3.語句前加上typedef

//給void(^)(void)類型的block指針起別名

typedef void (^MyBlock)(void);

別名block;

block = ^ {block code};

block (參數(shù));

//第三種方式:有返回值多個參數(shù)的block類型指針

NSString * (^block6)(int,NSString* name);

block6 = ^(intage,NSString* name){

return [NSString stringWithFormat:@"我叫%@,%d歲",name,age];

};

//有返回值定義要接收

NSString *info = block6(18,@"翠花");

NSLog(@"---%@----",info);

Info block7 = ^(intage,NSString* name){

return[NSString stringWithFormat:@"== my name is %@,%d age ==",name,age];

};

NSString *new = block7 (2,@"baby");

NSLog(@"%@",new);

block_cycle

- (void)viewDidLoad {

[super viewDidLoad];

self.objc= [[NSObject alloc] init];

void(^block)(void) = ^{

};

Block_copy(block);

Block_release(block);

block();

}

//block的聲明用copy:因為我們的block是聲明在棧上,如果用retain,那么block依舊在棧上,當方法結(jié)束執(zhí)行后,棧上就會被釋放.所以我們要copy到堆上,堆內(nèi)存有我們自己管理,不會被隨意釋放

//棧上copy到堆上手動管理不會被隨意釋放

@property (nonatomic,copy) MyBlockblock;

使用局部變量以防止出現(xiàn)循環(huán)引用

//**如果我們在block(用copy描述屬性的block)中用到self,會導致block對視圖控制器(self), --->retain會導致循環(huán)引用(我們當前的視圖控制器無法釋放)

//解決辦法:__block SecondViewController * vc = self;

__block SecondViewController *vc =self;

//為了防止循環(huán)引用聲明一個局部的視圖控制器 == self

//對于成員變量也可以聲明局部變量對其進行接收在對局部變量進行操作即可

//**如果我們在block(用copy描述屬性的block)中用到self,會導致block對視圖控制器(self), --->retain會導致循環(huán)引用(我們當前的視圖控制器無法釋放)

//解決辦法:__block NSObject * obc = _obje;

__blockNSObject* obc =_obje;

#pragma mark ==對非基本數(shù)據(jù)類型的影響

/*

block對于非基本數(shù)據(jù)類型的影響

對于沒有__block修飾的局部非基本數(shù)據(jù)類型的變量,block內(nèi)會對其進行淺copy,也就是說,block內(nèi)外的people對象不是同一個,無任何關(guān)系,而且block內(nèi)的people只能讀不能寫,但是我們可以修改對象的屬性

對于成員變量(全局變量,非基本數(shù)據(jù)類型)或者有)__block修飾的局部非基本數(shù)據(jù)類型的變量,block內(nèi)外是同一個值(訪問同同一塊內(nèi)存),而且可以對其值進行修改

*/

#pragma mark ==對基本數(shù)據(jù)類型的影響

/*

block對于基本數(shù)據(jù)類型的影響

對于沒有__block修飾的局部基本數(shù)據(jù)類型的變量,block內(nèi)會對其值進行copy(淺),也就是說,block內(nèi)外的count不是同一個,無任何關(guān)系,而且block內(nèi)的count只能讀,不能寫,

對于成員變量(全局,基本數(shù)據(jù)類型)或者有__block修飾的局部基本數(shù)據(jù)類型的變量,block內(nèi)外是同有個值(深copy ,訪問同一塊內(nèi)存),而且可以對其值進行修改

*/

自定義block塊回調(diào)

在要傳值的.h界面聲明一個typedef void ( ^方法名)(類 * 參數(shù)名)的block,并寫一個返回值類型為id的帶參數(shù)的自定義方法(不要*);然后在.m文件中實現(xiàn)這個方法,用block的方法名聲明一個block接收自定義方法的參數(shù) ,擴大作用域.在要回傳的方法中調(diào)用block塊,回調(diào)時()內(nèi)的參數(shù)就是要傳的值

在要接收值的界面,在聲明界面初始化的時候,調(diào)用自定義方法,在方法的block塊中接收值.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

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

  • 前言 Blocks是C語言的擴充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,781評論 0 23
  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,365評論 2 26
  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 733評論 2 1
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • 我們的項目基于Spring Boot + Maven,采用Intelli IDEA工具進行開發(fā)。代碼在另一名同事的...
    楊梅泡酒閱讀 37,947評論 10 8