和變數、控制流、條件一樣、函式也是現代程式語言的基本組成部分。他可以使我們在應用中重複利用一塊**,對於**的組織和維護是很有必要的。您將在ios和os x的框架中發現大量的例子。
像其他的基礎元素一樣,object-c的函式也是建立在c語言函式之上的。這章我們將介紹c語言最重要的方面,包括基本語法、宣告和實現、變數生命週期以及函式庫的注意事項。
比如,下面的例子,定義乙個getrandominteger函式,接受兩個int型別的引數,返回乙個int型別的返回值。在函式內部,我們通過minimum 和maximum 引數獲取傳遞給函式的值,通過reture關鍵字返回計算的值。在main函式中,我們可以通過傳遞10和-10作為引數,呼叫函式。
// main.m
import
int getrandominteger(int minimum, int maximum)
int main(int argc, const
char * argv)
return
0;}
內建的函式arc4random_uniform,可以返回從0到您傳遞引數的乙個隨機數。
函式可以使用指標引用作為函式的返回值和引數,這就意味著您可以同樣的方式使用object-c的物件。比如,在main中新增如下**。
// main.m
import .h>
nsstring *getrandommake(nsarray *makes)
int main(int argc, const
char * argv)
return
0;}
getrandommake 接受nsarray型別的物件作為引數,返回nsstring型別的物件。注意,它同樣使用*語法,宣告指標變數。
在使用函式之前,您必須定義函式。如果您定義getrandommake函式在main函式之後,當您呼叫這個函式時,編譯器是找不到這個函式的。這樣強加了乙個限制,不利於大型專案有的組織。為了解決這個問題,c語言將函式的宣告和實現分開了。
函式的宣告是告訴編譯器,函式的輸入和輸出是什麼樣的。通過提供返回資料型別和引數,編譯器確認您是否正確使用函式,但是不知道函式具體的實現。相應的函式實現實在宣告的基礎上新增了一塊**。
下面的**宣告了函式getrandommake ,所以您可以在main中呼叫,而且函式還沒有被實現。注意,函式申明中只需要引數的型別,引數的名字是可以省略的。
// main.m
import .h>
// declaration
nsstring *getrandommake(nsarray *);
int main(int argc, const
char * argv)
return
0;}
// implementation
nsstring *getrandommake(nsarray *makes)
正如您將要看到的,分離函式的宣告和實現,對於組織打的專案是很有用的。
static 關鍵字可以改變函式和變數的可見性。不幸的是,它的作用和他所使用的位置有關。本小節常用的兩個static用法。
通常函式時全域性可見的。也就是說,一旦您定義了乙個函式,您在其他任何地方都可以呼叫這個函式。static關鍵字可以限制函式只在當前檔案中可見,這樣對於建立乙個私有的函式和防止命名衝突很有用。
下面是怎樣建立乙個static函式的例子,如果您在另外乙個檔案宣告和實現函式,您在main函式中是不能呼叫函式的。注意static在函式的宣告和實現中都使用了。
// static function declaration
static
int getrandominteger(int, int);
// static function implementation
static
int getrandominteger(int minimum, int maximum)
宣告在函式中的變數,每次執行的時候都會被初始化。這是乙個很直觀的預設行為,也就是說函式會忘記,您呼叫它多少次。但是,如果您使用static宣告本地變數,函式可以記住不同呼叫的值。
比如,下面的變數currentcount ,從來都不會被重新初始化。我們不在main中定義技術變數,我們可以使用countbytwo計數。
// main.m
#import
int countbytwo()
int main(int argc, const
char * argv)
return
0;}
不想上節介紹的static函式,static不影響變數的可見性。所以本地變數只能在函式中訪問。
objec-c不支援命名空間,為了防止命名的衝突,我們在函式名之前加上字首,比如nsmakerange和cgimagecreate。
當您建立自己的函式時,函式的宣告和實現,在不同的檔案中。這樣使引入標頭檔案的檔案不必擔心函式的實現。比如carutilities 的標頭檔案如下所示:
// carutilities.h
#import
nsstring *cugetrandommake(nsarray *makes);
nsstring *cugetrandommodel(nsarray *models);
nsstring *cugetrandommakeandmodel(nsdictionary *makesandmodels);
相應的實現檔案定義函式的具體實現。因為檔案不支援引入函式實現,您可以使用static關鍵字,建立乙個私有的函式。
// carutilities.m
#import "carutilities.h"
// private function declaration
static
id getrandomitemfromarray(nsarray *anarray);
// public function implementations
nsstring *cugetrandommake(nsarray *makes)
nsstring *cugetrandommodel(nsarray *models)
nsstring *cugetrandommakeandmodel(nsdictionary *makesandmodels)
// private function implementation
static
id getrandomitemfromarray(nsarray *anarray)
現在,您可以引入標頭檔案,呼叫函式,如果定義在同乙個檔案中。如果您試圖在main中呼叫getrandomitemfromarray ,將會導致乙個編譯錯誤。
// main.m
import
import
"carutilities.h"
int main(int argc, const
char * argv) ;
nsstring *randomcar = cugetrandommakeandmodel(makesandmodels);
nslog(@"selected a %@", randomcar);
}return
0;}
本章用函式介紹,結束了c語言基礎講解。我們學習了宣告函式和實現函式,改變他們的可見性,使記住本地變數,和組織大的函式庫。
cocoa 和cocoa touch 中大部分功能都分裝的類中。現在我們已經做好了,學習object-c物件導向特性了,下章我們將學習類的定義、物件初始化、屬性的設定已經方法的呼叫。
C語言 函式
1 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生 型別不匹配 錯誤。2 實參可以是常量,變數,表示式甚至是函式。但是在傳遞給函式前,必須有確定的值。3 形參變數只有在被呼叫時才分配記憶體單元,只有在函式內部有效,函式結束後不能再使用。4 實參和形參佔據不同的儲存單元。5 函式預設採用值傳...
c語言 函式
函式是實現某個功能的 段 函式之間的關係是並列的,不能巢狀 函式的定義 函式的返回值型別 函式名 引數的型別 引數名1.正常的函式有三部分 1.函式的宣告 2.函式的定義 3.函式的呼叫 如果函式在定義之前被呼叫的話,需要對函式提前進行宣告,當然在定義之後在呼叫如果沒有宣告也不會提示錯誤 函式的返回...
C語言函式
1.宣告函式 include 函式 void printhelloworld 帶傳入引數 void hello char name 多個傳入引數 void hi char name,int age 帶返回值的函式 int add int a,int b int main 2 main 函式引數及返回...