自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從C語言的變量聲明到Objective-C中的Block語法

移動開發(fā)
花一些時間去了解代碼塊(block)衍生和組織形式,一旦明白了這些,就可以很方便的聲明和使用它,而不用每次需要的時候才去Google一下。

[[164693]]

在這篇文章中,從簡單的C語言中各種聲明開始,以及復雜的聲明組合,到***Objective-C中的代碼塊bokck的語法。

花一些時間去了解代碼塊(block)衍生和組織形式,一旦明白了這些,就可以很方便的聲明和使用它,而不用每次需要的時候才去Google一下。

如果你想把能想到的東西用block聲明表現(xiàn)出來,請繼續(xù)閱讀!

Declarators(說明符)

C語言中是通過說明符來聲明變量的。

一個說明符有兩個作用:

  1. 定義這個變量的類型;

  2. 給變量定義一個名字,以便在它的作用域中使用它;

讓我們用一個最基本的說明符開始:?

這很像你曾經(jīng)寫過的***行C語言代碼。

int 是基本的變量類型,a是變量的名字(或標示符)。

當開始看一個說明符的時候,應該從變量名(說明符)開始,先看變量名右邊的部分,然后看變量名左邊的部分(接下來的部分解釋為什么要這么做)。

int a;中在變量名a的右邊部分什么都沒有,所以它直接的說明了:a是一個int類型的變量。

一個變量的聲明只有一個基本類型,它就是說明符最左邊的部分。

說明符能夠通過修飾符去改變基本的數(shù)據(jù)類型,從而衍生出新的類型。修飾符就是下面的四種符號:*,[],(),^。

指針修飾符( 

類型仍舊是int,變量名是a。但是指針修飾符(*)意味著a是一個指針,指向一個int的值,而其本身不是一個int的值。

指針修飾符(*)總是在變量的左邊。

數(shù)組修飾符([]

上面的數(shù)組修飾符([])表示a是一組int,而不是一個簡單int值。聲明的時候要加上數(shù)組的長度,例如int a[10];

數(shù)組修飾符([])總是在變量的右邊。

函數(shù)修飾符 (()

 函數(shù)修飾符表示:f是一個返回int值得函數(shù)。函數(shù)修飾符可以攜帶參數(shù),例如int f(long);意味著:f是一個攜帶一個long型參數(shù)并且返回一個int類型值得函數(shù)。

函數(shù)修飾符()總是在變量的右邊。

修飾符的組合

指針修飾符(*)和數(shù)組修飾符([])

組合

修飾符可以組合在一起從而產生復雜的變量類型。就跟算術操作符相似,算術操作符可以組合在一起,然后按照優(yōu)先級的不同判斷先進行的操作(就向*和/的優(yōu)先級高于+/-),修飾符也如此。修飾符[]和()的優(yōu)先級高于秀是否*和^.因為[]和()的優(yōu)先級高,所以放在變量的右邊,因此當遇到復雜的說明符時,應該從變量名(標示符)開始,先看右邊的部分,在看左邊的部分。

例如

或者為了提高閱讀性用括號將變量名及右邊部分擴起來。

都是表示:a是一個指針數(shù)組,數(shù)組中的每一元素都指向一個int類型的值。

可能會有人問,怎么才能聲明一個指向一組int值得指針呢?下面的聲明方式就可以實現(xiàn):

指針修飾符的優(yōu)先級低于數(shù)組修飾符,因此要放在括號中來提高它的優(yōu)先級。這樣表示:a是一個指向一組int值得指針。

數(shù)組修飾符([])和函數(shù)修飾符()組合

你不能聲明一個數(shù)組,數(shù)組中的每個元素是一個函數(shù),也不能聲明一個函數(shù),該函數(shù)返回一個數(shù)組或者一個函數(shù)。但是一個函數(shù)的參數(shù)可以是一個數(shù)組。

例如?

以上表示:f是一個函數(shù),有一個參數(shù),該參數(shù)是一個長度為10的數(shù)組(數(shù)組中的每個元素是一個int類型的值),函數(shù)返回一個int類型值。

指針修飾符(*)和函數(shù)修飾符()組合

上面的兩個聲明都表示:f是個函數(shù),返回一個指針,該指針指向一個int類型的值。

如過想要一個指針,指向一個函數(shù),該什么辦呢?

上面的聲明表示:f是個函數(shù)指針,該指針指向一個返回int類型值得函數(shù)。

代碼塊(也稱閉包)修飾符(^

Apple在其proposed extension of the ANSI-C standard中引入了該修飾符。被稱作代碼塊指針修飾符(閉包修飾符)。該修飾符跟指向指針修飾符很類似。聲明一個代碼塊跟聲明一個指針,指向一個函數(shù)的方法是相同的。

該修飾符只能用于函數(shù),所以int ^a;是錯誤的。這就說明了為什么int ^b()時非法的,會引起編譯器錯誤的。如果按照上面說的閱讀說明符的方法來看該說明符,表示b是一個函數(shù),返回值是一個代碼塊指針,指向一個int類型的值。這也就是問什么要將^b放在括號中的原因。

b表示:一個代碼塊,指向一個返回int類型值的函數(shù)或者簡寫成代碼塊返回一個int類型的值。

你也可以在定義代碼會函數(shù)的時候攜帶參數(shù),例如

表示:代碼塊有一個long型的參數(shù),一個返回值,為int類型。

這就是代碼塊聲明的由來。

為了在Objective-C中使用代碼塊,有一些其他的語法需要你去記住的。1.定義代碼塊的語法;2.如何將一個代碼塊傳遞給一個Objective-C方法。

抽象的說明符

一個抽象說明符由2部分組成:一個抽象說明符,一個變量名。

抽象的說明符在標準C語言中有3種使用場景:

  1. int *a;long *b = (long *)a;(long *)就是一個抽象說明符:表示一個指向long型的指針。
  2. 作為sizeof()的參數(shù):malloc(sizeof(long *));
  3. 作為函數(shù)的參數(shù)類型:int f(long *);

Objective-C使用抽象說明符作為方法的參數(shù)或者方法的返回值;

  1. -?(long?**)methodWithArgument:(int?*)a; 

這里的(long **) 和 (int *) 都是抽象說明符。

所以為了能夠把代碼塊作為Objective-C方法中的參數(shù)或者返回值,我們需要去找到這些代碼快的抽象說明符??梢酝ㄟ^移除說明符中的變量名來獲取;

例如:

int (^b)() 移除變量名b獲取抽象說明符 int (^)() 和 int (^b)(long) 移除變量名b來獲取抽象說明符 int (^)(long).

例子:

  1. -?(void)methodWithArgument:(int(^)())block; 
  2. -?(void)anotherMethodWithArgument:(void(^)(long?arg1))block; 

在抽象說明符中參數(shù)的名字是可以省略的。因為Xocde會自動幫你將這些完成。

Block字面量

當你編寫int a = 2;時,int a是一個說明符,2是a的值,也稱實現(xiàn)。

脫字符(^)也被用來作為一元操作符,將一個函數(shù)實現(xiàn)轉換為代碼塊。你可以不用具體說明代碼塊的返回值,會自動從返回語句中推斷得到。

因為是代碼塊的實現(xiàn)部分,需要定義參數(shù)的名字。

例如:int (^block)(long, long);實現(xiàn)如下所示

  1. block?=?^(long?a,?long?b)?{ 
  2. ??int?c?=?a?+?b; 
  3. ??return?c; 

總結

看起來很復雜,Objective-C中的block語法建立在標準的C語法上。Objective-C中的block就像一個指針,指向一個函數(shù)。一旦明白這些,在加上稍加聯(lián)系,你會發(fā)現(xiàn)block很容易去掌握。

責任編輯:倪明 來源: CocoaChina翻譯活動
相關推薦

2015-06-25 11:21:33

C++Objective-C

2011-08-17 11:15:22

Objective-C語法

2011-07-29 16:16:30

Objective-c block

2011-08-04 10:57:33

Objective-C C語言 BOOL

2011-08-02 13:16:36

Objective-C 語法 函數(shù)

2011-05-11 13:54:08

Objective-C

2014-07-01 09:22:01

SwiftObjective-CiOS

2014-04-30 10:16:04

Objective-CiOS語法

2011-05-11 11:20:26

Objective-C

2011-04-08 10:51:17

Objective-CiOS

2011-07-18 16:36:51

Objective-C XCode

2010-11-04 16:32:00

Objective-C

2014-04-28 09:56:56

Objective-CiOS命名空間

2015-11-02 10:13:41

iOSObjective-C語法

2010-11-24 10:35:40

Objective-C

2014-10-13 09:54:08

Objective-CSwift

2014-04-15 11:27:50

C++開發(fā)者Objective-C核心語法

2011-06-27 15:48:09

Cocoa TouchObjective-C

2011-08-04 09:56:30

Objective-C 變量 數(shù)據(jù)類型

2014-08-05 13:09:34

Objective-C動態(tài)特性
點贊
收藏

51CTO技術棧公眾號