iOS中Block的基础用法
原文鏈接:http://www.jianshu.com/p/17872da184fb
本文簡介
本章不會(huì)對(duì)Block做過多的實(shí)現(xiàn)研究。只是講解基本的用法。純粹基礎(chǔ)知識(shí)。結(jié)合實(shí)際項(xiàng)目怎么去做舉例。Block使用場景,可以在兩個(gè)界面的傳值,也可以對(duì)代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。
Block簡介
Block是一種比較特殊的數(shù)據(jù)類型。它可以保存一段代碼,在合適的時(shí)候取出來調(diào)用。
Block的修飾
ARC情況下
1.如果用copy修飾Block,該Block就會(huì)存儲(chǔ)在堆空間。則會(huì)對(duì)Block的內(nèi)部對(duì)象進(jìn)行強(qiáng)引用,導(dǎo)致循環(huán)引用。內(nèi)存無法釋放。
解決方法:
新建一個(gè)指針(__weak typeof(Target) weakTarget = Target )指向Block代碼塊里的對(duì)象,然后用weakTarget進(jìn)行操作。就可以解決循環(huán)引用問題。
2.如果用weak修飾Block,該Block就會(huì)存放在棧空間。不會(huì)出現(xiàn)循環(huán)引用問題。
MRC情況下
用copy修飾后,如果要在Block內(nèi)部使用對(duì)象,則需要進(jìn)行(__block typeof(Target) blockTarget = Target )處理。在Block里面用blockTarget進(jìn)行操作。
Block的定義格式
返回值類型(^block變量名)(形參列表) = ^(形參列表) {
};
調(diào)用Block保存的代碼
block變量名(實(shí)參);
默認(rèn)情況下,Block內(nèi)部不能修改外面的局部變量
Block內(nèi)部可以修改使用__block修飾的局部變量
Block的模式
1.無參數(shù)無返回值的Block
2.有參數(shù)無返回值的Block
3.有參數(shù)有返回值的Block
Block簡單用法舉例
無參數(shù)無返回值的Block
/*** 無參數(shù)無返回值的Block*/ -(void)func1{/*** void :就是無返回值* emptyBlock:就是該block的名字* ():這里相當(dāng)于放參數(shù)。由于這里是無參數(shù),所以就什么都不寫*/void (^emptyBlock)() = ^(){NSLog(@"無參數(shù),無返回值的Block"); }; emptyBlock(); }有參數(shù)無返回值的Block
/*** 調(diào)用這個(gè)block進(jìn)行兩個(gè)參數(shù)相加** @param int 參數(shù)A* @param int 參數(shù)B** @return 無返回值*/void (^sumBlock)(int ,int ) = ^(int a,int b){ NSLog(@"%d + %d = %d",a,b,a+b); }; /** * 調(diào)用這個(gè)sumBlock的Block,得到的結(jié)果是20 */ sumBlock(10,10);有參數(shù)有返回值的Block
/*** 有參數(shù)有返回值** @param NSString 字符串1* @param NSString 字符串2** @return 返回拼接好的字符串3*/ NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){ return [NSString stringWithFormat:@"%@%@",str1,str2]; }; //調(diào)用logBlock,輸出的是 我是Block NSLog(@"%@", logBlock(@"我是",@"Block"));Block結(jié)合typedef使用
自己定義一個(gè)Block類型,用定義的類型去創(chuàng)建Block,更加簡單便捷。
這里舉例一個(gè)Block回調(diào)修改上一下界面的背景顏色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳轉(zhuǎn)到控制器2,然后在控制器2觸發(fā)事件回調(diào)修改控制器1的背景顏色為紅色。
ViewController2的實(shí)現(xiàn)
#import <UIKit/UIKit.h> @interface ViewController2 : UIViewController /** * 定義了一個(gè)changeColor的Block。這個(gè)changeColor必須帶一個(gè)參數(shù),這個(gè)參數(shù)的類型必須為id類型的 * 無返回值 * @param id */ typedef void(^changeColor)(id); /** * 用上面定義的changeColor聲明一個(gè)Block,聲明的這個(gè)Block必須遵守聲明的要求。 */ @property (nonatomic, copy) changeColor backgroundColor; @end -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//聲明一個(gè)顏色 UIColor *color = [UIColor redColor]; //用剛剛聲明的那個(gè)Block去回調(diào)修改上一界面的背景色 self.backgroundColor(color); }ViewController1的實(shí)現(xiàn)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ViewController2 *vc =[[ViewController2 alloc]init];// 回調(diào)修改顏色 vc.backgroundColor = ^(UIColor *color){ self.view.backgroundColor = color; }; [self.navigationController pushViewController:vc animated:YES]; }轉(zhuǎn)載于:https://www.cnblogs.com/liuyingjie/p/5274497.html
總結(jié)
以上是生活随笔為你收集整理的iOS中Block的基础用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五、线程管理————GCD
- 下一篇: iOS人脸识别