Objective-C語法之代碼塊(block)的使用

代碼塊本質上是和其它變量相似。不同的是,代碼塊存儲的數據是一個函數體。使用代碼塊是,你能夠像調用其它標準函數一樣,傳入參數數,并得到返回值。

脫字符(^)是塊的語法標記。依照我們熟悉的參數語法規約所定義的返回值以及塊的主體(也就是能夠執行的代碼)。下圖是怎樣把塊變量賦值給一個變量的語法解說:


依照調用函數的方式調用塊對象變量就能夠了:
int result = myBlock(4); // result是 28

1、參數是NSString*的代碼塊

        void (^printBlock)(NSString *x);printBlock = ^(NSString* str){NSLog(@"print:%@", str);};printBlock(@"hello world!");
執行結果是:print:hello world!

2、代碼用在字符串數組排序

        NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];NSComparator sortBlock = ^(id string1, id string2){return [string1 compare:string2];};NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];NSLog(@"sortArray:%@", sortArray);
執行結果:sortArray:(

? ? "abc 05",

? ? "abc 1",

? ? "abc 12",

? ? "abc 13",

? ? "abc 21"

)

3、代碼塊的遞歸調用

代碼塊想要遞歸調用,代碼塊變量必須是全局變量或者是靜態變量,這樣在程序啟動的時候代碼塊變量就初始化了,能夠遞歸調用

        static void (^ const blocks)(int) = ^(int i){if (i > 0) {NSLog(@"num:%d", i);blocks(i - 1);}};blocks(3);
執行打印結果:

num:3

num:2

num:1

?4、在代碼塊中使用局部變量和全局變量

在代碼塊中能夠使用和改變全局變量

int global = 1000;
int main(int argc, const char * argv[])
{@autoreleasepool {void(^block)(void) = ^(void){global++;NSLog(@"global:%d", global);};block();NSLog(@"global:%d", global);}return 0;
}

執行打印結果:

global:1001

global:1001

而局部變量能夠使用,可是不能改變。

        int local = 500;void(^block)(void) = ^(void){
//            local++;NSLog(@"local:%d", local);};block();NSLog(@"local:%d", local);
在代碼塊中改變局部變量編譯不通過。怎么在代碼塊中改變局部變量呢?在局部變量前面加上keyword:__block

        __block int local = 500;void(^block)(void) = ^(void){local++;NSLog(@"local:%d", local);};block();NSLog(@"local:%d", local);
執行結果:local:501

? ? ? ? ? ? ? ? ? ? local:501

著作權聲明:本文由http://blog.csdn.net/totogo2010/原創,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者博客鏈接,謝謝!




轉載于:https://www.cnblogs.com/mfrbuaa/p/3942224.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258236.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258236.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258236.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#委托和事件

http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 講解比較好 轉載于:https://www.cnblogs.com/sun-shadow/p/4872768.html

asp.net mvc使用mysql_ASP.NET開發實戰——(八)ASP.NET MVC 與數據庫之MySQL

之前介紹了My Blog如何使用http://ADO.NET來訪問SQL Server獲取數據。本章將介紹如何使用My SQL來完成數據管理。在使用My SQL之前需確保開發環境中安裝了My SQL數據庫和Connector/Net,后者是一個用C#編寫的http://ADO.NET數據提供器,換句話說無論使用SQ…

多元時代個人信息更需強有力保護

有網友反映,用多個搜索引擎搜索“手持身份證照片”,皆出現大量相關圖片,人臉清晰,身份證號碼等關鍵信息明白無誤。不少網友擔心“這么重要的信息就這么暴露,太危險”。記者發現,其中有弱勢群體求助信息&…

修改Eclipse自動換行長度

使用CtrlShiftF自動格式化代碼的時候,有時候折行太多反而讓代碼看起來更亂,不容易閱讀。 解決辦法: Window-->Preferences-->Java-->Code Style-->Formatter-->Edit-->Line Wrapping-->Maximum line width根據需要設置&…

卓越管理的實踐技巧(1)如何進行有效的指導 Guidelines for Effective Coaching

Guidelines for Effective Coaching 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了總結的13條卓越管理的實踐技巧并列出了所有實踐技巧名稱的索引,這篇文章主要寫卓越管理的實踐技巧的第(1)條:…

Java Web應用的生命周期

Java Web應用的生命周期。三個階段:啟動,運行,終止。  無論是web還是servlet他們的生命周期都是有容器來控制的。  啟動:  1. 把web.xm 加載到內存中  2. 為web應用創建一個ServletContext對象  3. 對所有的Filter進行初…

count返回0_你是一直認為 count(1) 比 count(*) 效率高么?

MySQL count(1) 真的比 count(*) 快么? 反正同事們都是這么說的,我也姑且覺得對吧,那么沒有自己研究一下究竟?如果我告訴你他們一樣,你信么?有 Where 條件的 count,會根據掃碼結果count 一下所有的行數&am…

13點建議順利通過JAVA面試【轉載】

原文:http://www.javamm.com/?p7274 找到一份高薪的java工作,從程序員走向高級程序員、架構師、分析員,是所有java程序員們的追求。 找一份好工作,自然要看工作經歷、項目積累、綜合能力。但是,在繁忙、瑣碎的日常工作…

微軟過冬的三大姿勢:裁員,回購400億美元股票,在中國開合資公司

近期沒什么大新聞的微軟,現在有了。 回購400億美元股票,給股東發“紅包” 先看一條開心的。根據外媒BusinessInsider的報道,微軟日前發表聲明稱,董事會已經批準了一項價值上限達400億美元的新股票回購計劃,此次回購計劃…

獲取進程CPU占用率

獲取進程CPU占用率 // 時間轉換 static __int64 file_time_2_utc(const FILETIME* ftime) {LARGE_INTEGER li;li.LowPart ftime->dwLowDateTime;li.HighPart ftime->dwHighDateTime;return li.QuadPart; }// 獲得CPU的核數 static int get_processor_number() {SYSTEM_…

dbeaver連接mysql失敗_關于DBeaver連接MySQL數據庫遇到的版本問題解決

在使用DBeaver連接MySQL數據庫時,明明按照它提示進行jar包的下載,但是仍然報錯,提示版本問題,那么這個時候我們要解決的就是MySQL版本對應驅動包的問題。筆者經過測試后有了一些心得,放上來希望對大家能夠有所參考。首…

巴倫周刊:“物聯網”正走向死胡同

作為當今科技界最流行的熱門術語之一,“物聯網”實際上是個使用不當的稱呼,而對于科技界來說這是個大問題。顧名思義,“物聯網”是由大量設備組成,比如智能家居設備制造商Nest的家用恒溫器、蘋果公司智能手表Apple Watch以及健身設…

【WIN10】VisualStateManager使用說明

Demo下載:http://yunpan.cn/cFjgPtWRHKH9H 訪問密碼 c4b7 顧名思義,視圖狀態管理器。 在WPF中,它的功能似乎更強大。在UWP中,閹割了GotElementState方法,導致它只能在控件內部使用。 這個東東一般用來突出某些操作&am…

mysql against包含英文_在MySQL中使用MATCH和AGAINST選擇特定列中包含字符串的行

讓我們首先創建一個表-mysql> create table DemoTable1833(Name varchar(20));修改表-Mysql> alter table DemoTable1833 ADD FULLTEXT(Name);Records: 0 Duplicates: 0 Warnings: 1使用插入命令在表中插入一些記錄-mysql> insert into DemoTable1833 values(John D…

Hadoop偽分布配置與基于Eclipse開發環境搭建

國內私募機構九鼎控股打造APP,來就送 20元現金領取地址:http://jdb.jiudingcapital.com/phone.html內部邀請碼:C8E245J (不寫邀請碼,沒有現金送)國內私募機構九鼎控股打造,九鼎投資是在全國股份…

百度地圖JavaScript API覆蓋物旋轉時出現偏移

在項目中&#xff0c;調用百度地圖JavaScript API&#xff0c;做覆蓋物的旋轉再添加到地圖上&#xff0c;結果出現偏移了。 調試過程中的效果圖&#xff1a; 發現圖片的旋轉并不是按車子的中心來的&#xff0c;而是之外的一個點。最后發現犯了一個很細節的錯&#xff1a; <s…

英利1500伏光伏組件系列亮相美國

2016年4月21日&#xff0c;英利宣布其公用事業規模太陽能光伏生產線YGE-U1500系列亮相美國。 近日&#xff0c;美國保險商實驗室&#xff08;UL&#xff09;對新型光伏板系列進行認證&#xff0c;可用于最大系統電壓為1500伏的項目。 部署英利多晶硅YGE-U 1500光伏組件系列可為…

eclipse 關閉時progress information彈框_Spring開發環境搭建(Eclipse)

開發環境搭建&#xff0c;主要包含2部分:Java安裝Eclipse安裝為易于學習&#xff0c;我們只安裝這2個部分&#xff0c;對于一般開發學習也足夠了。如果你有其他要安裝的&#xff0c;酌情添加。Java安裝我們使用Java8&#xff1a;下載JDK32位下載x86版本&#xff0c;64位下載x64…

紫薯銅鑼燒

材料&#xff1a; 全麥粉 三勺 雞蛋 一只 毅力低脂純牛奶 半盒 紫薯 蜂蜜 一勺 做法&#xff1a; 1. 雞蛋打開&#xff0c;加入半盒牛奶&#xff0c;分三次加入三勺全麥面粉&#xff0c;每次加入都要上下攪拌&#xff0c;面粉要過篩&#xff0c;最后加入半勺蜂蜜 2.紫薯蒸熟壓…

共享單車,信息安全應未雨綢繆

前日&#xff0c;摩拜單車首現泉州&#xff0c;一時間泉州的共享單車市場呈現出“三國殺”局面。據了解&#xff0c;目前三個平臺收取的押金金額每人在199元至300元不等&#xff0c;且都約定押金可原路退還&#xff0c;但積沙成塔&#xff0c;成千上萬用戶繳納的押金就相當可觀…