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