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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C语言函数指针 和 OC-Block

發布時間:2025/7/25 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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