生活随笔
收集整理的這篇文章主要介紹了
ios学习笔记block回调的应用(一个简单的例子)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么是Blocks ? ???? Block是一個C級別的語法以及運行時的一個特性,和標準C中的函數(函數指針)類似,但是其運行需要編譯器和運行時支持,從ios4.0開始就很好的支持Block。?二、在ios開發中,什么情況下使用Block ? ???? Block除了能夠定義參數列表、返回類型外,還能夠獲取被定義時的詞法范圍內的狀態(比如局部變量),并且在一定條件下(比如使用__block變量)能夠修改這些狀態。此外,這些可修改的狀態在相同詞法范圍內的多個block之間是共享的,即便出了該詞法范圍(比如棧展開,出了作用域),仍可以繼續共享或者修改這些狀態。通常來說,block都是一些簡短代碼片段的封裝,適用作工作單元,通常用來做并發任務、遍歷、以及回調。?三、block如何申明(對比于c語言中的函數申明) ?
?
四、c函數指正和blocks調用 ? ???? int (*CFunc) (int a) 函數調用? ???? int result = CFunc(10);? ???? int (^BFunc)? (int? a)? 函數調用? ???? int result = BFunc(10);?五、__block? 關鍵字 ? ???? 一個Block的內部時可以引用自身作用域外的變量的,包括static變量,extern變量或自由變量(定義一個變量的時候,如果不加存儲修飾符,默認情況下就是自由變量auto,auto變量保存在stack中的。除了auto之外還存在register,static等存儲修飾符),對于自由變量,在Block中只讀的。在引入block的同時,還引入了一種特殊的__block關鍵字變量存儲修飾符。?六、block的幾個小例子 ?
Java代碼??
#import?<Cocoa/Cocoa.h>?? ?? ?? int?main(int?argc,?char?*argv[])?? {?? ????@autoreleasepool?{?? ????????NSLog(@"Hello?world");?? ????????void?(^myblocks)?(void)?=?NULL;?? ????????myblocks?=?^(void)?{?? ????????????NSLog(@"in?blocks");?? ????????};?? ????????NSLog(@"before?myblocks");?? ????????myblocks();?? ????????NSLog(@"after?myblocks");?? ?????????? ?????????? ????????int?(^myblocks2)?(int?a,?int?b)?=?^(int?a,?int?b)?{?? ????????????int?c?=?a?+?b;?? ????????????return?c;?? ????????};?? ????????NSLog(@"before?blocks2");?? ????????int?ret?=?myblocks2(10,?20);?? ????????NSLog(@"after?blocks2?ret?%d",?ret);?? ?????????? ???????? ????????__blockint?sum?=?0;?? ????????int?(^myblocks3)?(int?a,?int?b)?=?^(int?a,?int?b)?{?? ????????????sum?=?a?+?b;?? ????????????return3;?? ????????};?? ????????myblocks3(20,?30);?? ????????NSLog(@"sum?is?%d",?sum);?? ????}?? ????returnNSApplicationMain(argc,?(constchar?**)argv);?? }?? 打印結果如下? 2012-09-03 10:23:20.878 blockTest[407:403] Hello world? 2012-09-03 10:23:20.880 blockTest[407:403] before myblocks? 2012-09-03 10:23:20.881 blockTest[407:403] in blocks? 2012-09-03 10:23:20.881 blockTest[407:403] after myblocks? 2012-09-03 10:23:20.882 blockTest[407:403] before blocks2? 2012-09-03 10:23:20.882 blockTest[407:403] after blocks2 ret 30? 2012-09-03 10:23:20.882 blockTest[407:403] sum is 50?七、block寫的回調例子 ? 1、Dog.h?
Java代碼??
#import?<Foundation/Foundation.h>?? ?? ?? @interface?Dog?:?NSObject?{?? ????int?_ID;?? ????NSTimer?*timer;?? ????int?barkCount;?? ?????? ???? ????void?(^BarkCallback)?(Dog?*thisDog,?int?count);?? }?? @property?(assign)?int?ID;?? ?? ?? -(void)?setBark:(?void?(^)?(Dog?*thisDog,?int?count)?)?eachBark;?? ?? ?? @end?? 2、Dog.m?
Java代碼??
#import?"Dog.h"?? ?? ?? @implementation?Dog?? @synthesize?ID?=?_ID;?? ?? ?? -(id)?init?? {?? ????self?=?[superinit];?? ????if?(self)?{?? ???????? ????????timer?=?[NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(updateTimer:)?userInfo:nilrepeats:YES];?? ?????????? ????}?? ????returnself;?? }?? ?? ?? -(void)?updateTimer:(id)?arg?? {?? ????barkCount?++;?? ????NSLog(@"dog?%d?bark?count?%d",?_ID,?barkCount);?? ???? ????if?(BarkCallback)?{?? ???????? ????????BarkCallback(self,?barkCount);?? ????}?? }?? ?? ?? ?? ?? -(void)?setBark:(void?(^)(Dog?*,?int))eachBark?? {?? ????[BarkCallbackrelease];?? ????BarkCallback?=?[eachBark?copy];?? }?? ?? ?? -(void)?dealloc?? {?? ????[BarkCallbackrelease];?? ????[superdealloc];?? }?? @end?? 3、Person.h?
Java代碼??
#import?<Foundation/Foundation.h>?? #import?"Dog.h"?? ?? ?? @interface?Person?:?NSObject?? {?? ????Dog?*_dog;?? }?? ?? ?? @property?(retain)?Dog?*dog;?? ?? ?? @end?? 4、Person.m?
Java代碼??
#import?"Person.h"?? ?? ?? @implementation?Person?? @synthesize?dog?=?_dog;?? ?? ?? -(void)?setDog:(Dog?*)dog?? {?? ????if?(_dog?!=?dog)?{?? ????????[_dogrelease];?? ????????_dog?=?[dog?retain];?? ?????????? ????????[_dogsetBark:^(Dog?*thisDog,?int?count)?{?? ????????????NSLog(@"person?dog?%d?count?%d",?[thisDog?ID],?count);?? ????????}];?? ????}?? }?? ?? ?? -(Dog?*)?dog?? {?? ????return_dog;?? }?? ?? ?? -(void)?dealloc?? {?? ????self.dog?=?nil;?? ????[superdealloc];?? }?? ?? ?? @end?? 5、Main.m?
Java代碼??
#import?<Foundation/Foundation.h>?? #import?"Person.h"?? #import?"Dog.h"?? ?? ?? int?main(int?argc,?constchar?*?argv[])?? {??
轉載于:https://www.cnblogs.com/kenshinobiy/p/4814982.html
總結
以上是生活随笔 為你收集整理的ios学习笔记block回调的应用(一个简单的例子) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。