第十讲:Obj-C Blocks 应用
轉(zhuǎn):http://tigercat1977.blog.163.com/blog/static/2141561122012111295955891/
第十講:Obj-C Blocks 應(yīng)用?
2012-12-12 09:59:55|? 分類: Objective-C |? 標簽:objective-c? |字號大中小 訂閱
主要內(nèi)容????? Blocks 是什么
????? Blocks 和 C 語言函數(shù)指針區(qū)別
????? 如何調(diào)用 Blocks
????? 代理兩端如何通過 Blocks 通訊
什么是 Blocks
????? Blocks 是一個 C Level 的語法以及運行時的一個特性,和標準 C 中的函數(shù)(函數(shù)指針)類似,但是其運行需要編譯器和運行時支持,從 IOS 4.0 開始就很好的支持 Block。
Blicks typedef 定義
????? C語言函數(shù)指針 typedef
????? typedef int (*SumBlockT)(int a, int b);
????? Block typedef 定義
????? typedef int (^SumBlockT)(int a, int b);
__block 關(guān)鍵字
????? 一個Block 的內(nèi)部是可以引用自身作用域外的變量的,包括 static 變量,extern 變量或自由變量 ( 定義一個變量的時候,如果不加存儲修飾符,默認情況下就是自由變量 auto , auto 變量保存在 stack 中的, 除了 auto 之外還存在 register , static 等存儲修飾符 ), 對于自由變量,在 Block 中是只讀的。在引入 block 的同時,還引入了一種特殊的 __block 關(guān)鍵字變量存儲修飾符
Blocks 簡單用法舉例
// main.m
#import <Foundation/Foundation.h> // 定義 Blocks 的 typedef typedef int (^SumBlockT) (int a, int b); int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); void (^myblocks) (void) = NULL; myblocks = ^(void){ NSLog(@"in blocks"); }; // 給 myblocks 賦值 NSLog(@"before myblocks"); myblocks(); // 執(zhí)行 myblocks; NSLog(@"after myblocks"); /* 輸出結(jié)果: Hello, World! before myblocks in blocks after myblocks */ int (^myblock2) (int a, int b) = ^(int a, int b){ int c = a + b; return c; }; NSLog(@"before block2"); int ret = myblock2(10,20); NSLog(@"after block2 ret %d", ret); /* 輸出結(jié)果: before block2 after block2 ret 30 */ __block int sum = 0; // 調(diào)用外部變量 需要使用 __block 存儲修飾符 int (^myblocks3) (int a, int b) = ^(int a, int b){ sum = a+b; return 3; }; myblocks3(20, 30); NSLog(@"sum is %d", sum); /* 輸出結(jié)果: sum is 50 */ // 前面定義 Blocks 的 typedef SumBlockT SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"c is %d", a+b); return 0; }; myblocks4(50, 20); /* 輸出結(jié)果: c is 70 */ } return 0; }
Blocks 案例
轉(zhuǎn)載于:https://www.cnblogs.com/jackljf/archive/2013/03/07/3589247.html
總結(jié)
以上是生活随笔為你收集整理的第十讲:Obj-C Blocks 应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 常量池 和 堆 的关系_Jav
- 下一篇: 统一管理MOSS2010用户头像