3.5.1 塊的特點
一些物件導向的動態語言如ruby、groovy,都提供了對塊的支援(在groovy中,塊被稱作為閉包「closure」)。塊是用一對{}括號括起來的多個語句的集合。類似於函式,但不同於函式,可以把塊作為表示式或變數的一部分,或者作為引數傳遞。在作為引數傳遞塊時,**被作為資料的一部分進行傳遞。
塊具有以下特徵:
同函式一樣,有型別化引數列表。
有返回結果或者要申明返回型別。
能獲取同一作用域(與塊所在同一作用域)內的狀態。
可以修改同一作用域的狀態(變數)。
與同一範圍內的其他塊同享變數。
在作用域釋放後能繼續共享和改變同一範圍內的變數。
除以上特點外,甚至可以複製塊並傳遞到其他後續執行的執行緒,編譯器和執行時負責把所有塊引用的變數保護在所有塊的拷貝的生命週期內。當然,這已經超出了本章的範圍,可以參考蘋果官方文件來了解這些內容。
3.5.2 objective-c 中的塊
對於c和c++,塊是變數,但對於objective-c,塊仍然是物件。下面簡單介紹objective-c中的塊。
1.塊變數宣告
用^操作符宣告乙個塊變數的開始,分號表示塊結束,如下**所示:
int multiplier = 7;
int (^myblock)(int) = ^(int num) ;
塊語法比較奇怪,塊變數宣告的解釋如圖3-2所示。
塊變數的宣告語句從前至後分為了幾部分:
返回值型別,如int、double,如果未顯式地宣告塊的返回值型別,可能會自動從塊**中推斷返回型別(通過return語句)。
塊變數名用括號括住,塊變數名前加^符號。
引數型別用括號括住,多個引數以逗號分隔,如果引數列表為void,而且返回型別依靠推斷,可以省略引數列表的void。
等號,將後面的塊賦值給前面的塊變數(即myblock)。
以^開頭並以;結束的塊定義。
塊定義中又分為以下兩個部分(除去開頭的^和結尾的;外):
引數列表,同函式的引數列表。
塊體,同函式體。
值得注意的是,塊可以使用同一作用域內定義的變數,而函式不行。
一旦宣告了塊,你可以像使用函式一樣呼叫它:
int multiplier = 7;
int (^myblock)(int) = ^(int num) ;
printf ( "%d", myblock(3));
2.行內塊
有時候,你不準備重複使用某個塊,因此你不必為它想乙個名稱。那你可以使用行內塊而不用宣告為塊變數。以下**來自蘋果文件:
// gsort_b類似標準的 gsort_r 函式,但它最後乙個引數是乙個塊。
char mycharacters[3] = ;
qsort_b(mycharacters, 3, sizeof(char ), ^(const void l, const void r) );
// mycharacters 現在是
__block int x = 123; // x 是塊可寫的
void (^printxandy)(int) = ^(int y) ;
printxandy(456); // 列印出: 579 456
// x 現在的值是:579
下面顯示了在塊中使用多種型別的變數:
extern nsinteger counterglobal;
static nsinteger counterstatic;
; ++localcounter;
localcharacter = 'b';
ablock();
}
企業級業務系統開發實戰 序言
前些年一直在做微軟的解決方案實施與軟體開發的工作。在學習 專案實施 開發與管理的過程中學到了別人不少好的東西,也自身總結了大量的經驗,希望能夠通過乙個系列來跟大家分享關於軟體開發方面的內容。這個開發系列的由來是這樣的,兩年前作為乙個軟體公司的技術總監,完成了乙個企業的erp系統開發,我在這個專案中擔...
企業級開發框架 Django 一
這次學習python世界中應用最廣泛的 發展最成熟的django web框架。因為django足夠完整,所以使用django自身就可以開發出非常完整的web應用,並不需要借助像sqlalchemy之類的其他資料訪問元件,本節我講介紹django的歷史 特點 總體架構,並在時間中安裝django框架。...
Spark企業級應用開發和調優
spark專案程式設計優化歷程記錄,主要介紹了spark企業級別的開發過程中面臨的問題和調優方法。包含合理分配分片,避免計算中間結果 大資料量 的collect,合理使用map,優化廣播變數等操作,降低網路和磁碟io,提高計算效率。首先如下圖 2.1 spark應用開發在集群 偽分布式 中的記錄,每...