日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C语言函数指针 和 OC-Block

發(fā)布時間:2025/7/25 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言函数指针 和 OC-Block 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C語言函數(shù)指針 和 OC-Block

一、 C語言函數(shù)指針 ?

關(guān)于函數(shù)指針的知識詳細(xì)可參考:?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級別的語法以及運(yùn)行時的一個特性,和標(biāo)準(zhǔn)C中的函數(shù)(函數(shù)指針)類似,但是其運(yùn)行需要編譯器和運(yùn)行時支持,從ios4.0開始就很好的支持Block。?

2、在ios開發(fā)中,什么情況下使用Block?

???? Block可以作為類的屬性,作為方法的參數(shù),還可以在方法內(nèi)部定義一個block局部變量,用來保存一段代碼。簡單來說,block就是一個特殊類型的變量(和變量int a一樣),保存一段代碼,然后在適當(dāng)?shù)臅r候運(yùn)行,通常用來做并發(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,??因?yàn)閕nt(^)(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的類型

可見當(dāng)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修飾的自由變量(定義一個變量的時候,如果不加存儲修飾符,默認(rèn)情況下就是自由變量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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。