日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS中Block的基础用法

發布時間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS中Block的基础用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:http://www.jianshu.com/p/17872da184fb
本文簡介

本章不會對Block做過多的實現研究。只是講解基本的用法。純粹基礎知識。結合實際項目怎么去做舉例。Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數的傳遞等。用過GCD就知道Block的精妙之處。

Block簡介

Block是一種比較特殊的數據類型。它可以保存一段代碼,在合適的時候取出來調用。

Block的修飾

ARC情況下
1.如果用copy修飾Block,該Block就會存儲在堆空間。則會對Block的內部對象進行強引用,導致循環引用。內存無法釋放。
解決方法:
新建一個指針(__weak typeof(Target) weakTarget = Target )指向Block代碼塊里的對象,然后用weakTarget進行操作。就可以解決循環引用問題。

2.如果用weak修飾Block,該Block就會存放在棧空間。不會出現循環引用問題。

MRC情況下
用copy修飾后,如果要在Block內部使用對象,則需要進行(__block typeof(Target) blockTarget = Target )處理。在Block里面用blockTarget進行操作。

Block的定義格式

返回值類型(^block變量名)(形參列表) = ^(形參列表) {
};
調用Block保存的代碼
block變量名(實參);

默認情況下,Block內部不能修改外面的局部變量
Block內部可以修改使用__block修飾的局部變量

Block的模式

1.無參數無返回值的Block
2.有參數無返回值的Block
3.有參數有返回值的Block

Block簡單用法舉例

無參數無返回值的Block

/*** 無參數無返回值的Block*/ -(void)func1{/*** void :就是無返回值* emptyBlock:就是該block的名字* ():這里相當于放參數。由于這里是無參數,所以就什么都不寫*/void (^emptyBlock)() = ^(){NSLog(@"無參數,無返回值的Block"); }; emptyBlock(); }

有參數無返回值的Block

/*** 調用這個block進行兩個參數相加** @param int 參數A* @param int 參數B** @return 無返回值*/void (^sumBlock)(int ,int ) = ^(int a,int b){ NSLog(@"%d + %d = %d",a,b,a+b); }; /** * 調用這個sumBlock的Block,得到的結果是20 */ sumBlock(10,10);

有參數有返回值的Block

/*** 有參數有返回值** @param NSString 字符串1* @param NSString 字符串2** @return 返回拼接好的字符串3*/ NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){ return [NSString stringWithFormat:@"%@%@",str1,str2]; }; //調用logBlock,輸出的是 我是Block NSLog(@"%@", logBlock(@"我是",@"Block"));
Block結合typedef使用

自己定義一個Block類型,用定義的類型去創建Block,更加簡單便捷。
這里舉例一個Block回調修改上一下界面的背景顏色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳轉到控制器2,然后在控制器2觸發事件回調修改控制器1的背景顏色為紅色。

ViewController2的實現

#import <UIKit/UIKit.h> @interface ViewController2 : UIViewController /** * 定義了一個changeColor的Block。這個changeColor必須帶一個參數,這個參數的類型必須為id類型的 * 無返回值 * @param id */ typedef void(^changeColor)(id); /** * 用上面定義的changeColor聲明一個Block,聲明的這個Block必須遵守聲明的要求。 */ @property (nonatomic, copy) changeColor backgroundColor; @end -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//聲明一個顏色 UIColor *color = [UIColor redColor]; //用剛剛聲明的那個Block去回調修改上一界面的背景色 self.backgroundColor(color); }

ViewController1的實現

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ViewController2 *vc =[[ViewController2 alloc]init];// 回調修改顏色 vc.backgroundColor = ^(UIColor *color){ self.view.backgroundColor = color; }; [self.navigationController pushViewController:vc animated:YES]; }

轉載于:https://www.cnblogs.com/liuyingjie/p/5274497.html

總結

以上是生活随笔為你收集整理的iOS中Block的基础用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。