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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ios学习笔记block回调的应用(一个简单的例子)

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);??
  • ??????????
  • ????????//此處如果不加__block會報錯??
  • ????????__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;??
  • ??????
  • ????//定義一個blocks變量??
  • ????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)?{??
  • ????????//每隔1s調用一次updateTimer方法??
  • ????????timer?=?[NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(updateTimer:)?userInfo:nilrepeats:YES];??
  • ??????????
  • ????}??
  • ????returnself;??
  • }??
  • ??
  • ??
  • -(void)?updateTimer:(id)?arg??
  • {??
  • ????barkCount?++;??
  • ????NSLog(@"dog?%d?bark?count?%d",?_ID,?barkCount);??
  • ????//向Person對象進行匯報??
  • ????if?(BarkCallback)?{??
  • ????????//調用從Person傳過來的Blocks??
  • ????????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回调的应用(一个简单的例子)的全部內容,希望文章能夠幫你解決所遇到的問題。

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