C语言函数指针 和 OC-Block
C語言函數指針 和 OC-Block
一、 C語言函數指針 ?
關于函數指針的知識詳細可參考:?http://www.cnblogs.com/mjios/archive/2013/03/19/2967037.html
#include <stdio.h> //在main之前定義一個函數 int sum(int a, int b) {return a + b; }int main() {//定義函數指針變量pfunc,指向sum函數int (*pfunc)(int a, int b) = sum; // int (*pfunc)(int, int) = sum; // int (*pfunc)() = sum; // int (*pfunc)(int a,int b); pfunc = sum;// 利用指針變量p調用函數int result = pfunc(1, 3);//int result = (*pfunc)(1, 3); 也可以return 0; }?
二、OC中block知識
1、什么是Blocks?
???? Block是一個C級別的語法以及運行時的一個特性,和標準C中的函數(函數指針)類似,但是其運行需要編譯器和運行時支持,從ios4.0開始就很好的支持Block。?
2、在ios開發中,什么情況下使用Block?
???? Block可以作為類的屬性,作為方法的參數,還可以在方法內部定義一個block局部變量,用來保存一段代碼。簡單來說,block就是一個特殊類型的變量(和變量int a一樣),保存一段代碼,然后在適當的時候運行,通常用來做并發任務、遍歷、以及回調。?
3、直接聲明、定義、調用block類型的變量
// // ViewController.m // #import "ViewController.h"@implementation ViewController {int(^sumBlock)(int x,int y); //聲明int(^)(int,int)類型變量sumBlock,block是匿名的函數int (^)(int,int) 有名字的函數int sum(int,int) }- (void)viewDidLoad {[super viewDidLoad];sumBlock = ^int(int x, int y){ //block賦值(定義)return x+y;}; }- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {if(sumBlock) sumBlock(10,20); //block調用 }@end?
4. block的typedefine別名
typedef int(^IntBlock)(int,int);
?//給int(^)(int,int)類型取了個別名叫IntBlock,??因為int(^)(int,int)是一種特殊的數據類型:Block,所以typedef語句之后,IntBlock就是一種數據類型,和int/float/double一樣。這樣使用起來就非常方便。
?
5.block作為類的屬性
//在創建完block的時候需要調用copy的方法。copy會把block從棧上移動到堆上。
@property (copy,nonatomic) int(^sumBlock)(int,int); ?//定義了一個int(^)(int,int)類型的屬性sumBlock
@property (copy,nonatomic) IntBlock intBlock; ? ? ? ? ??//定義了一個int(^)(int,int)類型的屬性intBlock
?
6.block作為方法參數(形參)的寫法
- (void)testBlock:(void (^) ()) aBlock;
- (void)printResult:(?int (^) (int, int)?)sumBlock; ?//此處( int(^)(int, int) )是sumBlock的類型
可見當block作為函數參數時,只是將block類型用()括起來,然后將block名字寫在block類型后面而已。
調用方法時,給block類型的形參賦值:
[self printResult:^int(int x, int y) {?
? ? ? ? return x+y;
? ? }];
[WZCategory ?mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
? ? ? ? return @{@"ID":@"id"};? ?
}];
?
7、__block? 關鍵字?
???? 一個Block內部時可以使用自身作用域外的靜態變量(static變量),全局變量(extern變量),__block修飾的自由變量(定義一個變量的時候,如果不加存儲修飾符,默認情況下就是自由變量auto,auto變量保存在stack中的。除了auto之外還存在register,static等存儲修飾符),對于自由變量,在Block中只讀的。 如果想要在block中使用auto變量,需要在自由變量之前加上__block關鍵字修飾。
?
?
三、C語言函數指針 和 OC-Block 對比
?1.聲明和調用寫法對比
?int (*CFunc) (int a); ? ? ? ?指向函數的指針
?int result = CFunc(10);?
?int (^BFunc)? (int? a); ? ? 保存一段代碼的block, block是匿名的函數int (^)(int,int) ?有名字的函數int sum(int,int)
?int result = BFunc(10);??
?
2. block和函數指針都可以看成是一種數據類型,就像int、float、NSString一樣。
3. iOS中將用block定義好的變量看作是一個對象,block對象在作為屬性時使用copy關鍵字。
?
轉載于:https://www.cnblogs.com/stevenwuzheng/p/5516985.html
總結
以上是生活随笔為你收集整理的C语言函数指针 和 OC-Block的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链项目-Lisk
- 下一篇: 集合2--毕向东java基础教程视频学习