97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠(yuǎn)見教育科技集團 >> iOS資料 >> iOS開發(fā)入門:Objective-C基礎(chǔ)語法(一)  
 
iOS開發(fā)入門:Objective-C基礎(chǔ)語法(一)
分享到:

Objective-C 并不是一門復(fù)雜的語言,經(jīng)過一段時間的接觸,你就能體會到它的優(yōu)雅。Objective-C 語言實現(xiàn)了嚴(yán)格的面向?qū)ο缶幊,它擴展了標(biāo)準(zhǔn) ANSI C 語言,增加了定義類和方法的語法,它還推行類和接口的動態(tài)擴展性,使任何類都能適配和采用。

Objective-C是C 語言的超集

既然是 C 語言的超集,Objective-C 支持所有 C 語言的基本語法。你可以繼續(xù)按你的習(xí)慣書寫代碼,例如原始類型(intfloat 等)、結(jié)構(gòu)、函數(shù)、指針,還有過程控制語句例如 if…elsefor 語句。你可以使用標(biāo)準(zhǔn) C 語言庫,比如 stdlib.hstdio.h 中聲明的內(nèi)容。

Objective-C 在 ANSI C 的基礎(chǔ)上增加了如下內(nèi)容:

·定義新類的語法規(guī)約
    ·類和實例方法的規(guī)約
    ·調(diào)用方法的語法(稱為消息機制)
    ·聲明屬性并從中合成存取方法的語法
    ·靜態(tài)和動態(tài)類型的規(guī)約
    ·塊對象(Block)- 封裝起來的代碼片段,可以在任何時候被執(zhí)行
    ·對基本語言的擴展,例如協(xié)議、范疇類等

如果現(xiàn)在還不明白這些 Objective-C 概念也不必?fù)?dān)心,當(dāng)你繼續(xù)閱讀后面的內(nèi)容時就會學(xué)習(xí)這些概念。如果你是初次接觸面向?qū)ο蟾拍畹拈_發(fā)者,可以先把對象想象成一個含有函數(shù)的結(jié)構(gòu),這個比喻不算太離譜,尤其對運行時的實現(xiàn)而言。

類和對象

和其他大部分面向?qū)ο缶幊陶Z言一樣,Objective-C 中的類也支持封裝數(shù)據(jù),以及定義可以在該數(shù)據(jù)上執(zhí)行的動作。對象是運行時類的一個實例。在類里聲明了的實例變量和方法,它的每個實例都在內(nèi)存中擁有同樣的實例變量,以及指向那些方法的指針。創(chuàng)建一個對象時,你需要經(jīng)過兩個步驟:內(nèi)存分配(allocation)和初始化(initialization)。

Objective-C 中的類有自己的規(guī)范要求,必須包括兩個不同的部分:接口(interface)和實現(xiàn)(implementation)。接口部分含有類的聲明、實例變量和相關(guān)方法的聲明。既然是作為 C 語言,通過分別定義頭文件和源文件,你就可以將公有聲明和具體的實現(xiàn)代碼給分離開來。(你可以在實現(xiàn)文件里放一些聲明代碼,因為有些情況下,它們共同構(gòu)成一個公用程序里的接口部分。)下表列出了這些文件的后綴以及區(qū)別:

后綴、源文件類型:

·.h – 頭文件。頭文件含有類、類型、函數(shù)和常量的聲明。
    ·.m – 源文件。這個后綴的源文件可以同時包含 Objective-C 和 C 語言的代碼。
    ·.mm – 源文件。這個后綴的源文件可以同時包含 C++、Objective-C 以及 C 語言的代碼。只有在你的 Objective-C 代碼中用到了 C++ 的類或者特性時才需要使用這個后綴。

如果需要在源代碼中包含頭文件,你需要使用 #import 命令,和 C 語言中的 #include 命令類似。兩者的區(qū)別在于,#import 能夠保證頭文件只被包含一次。

圖 1 中是一段的類聲明的語法展示,聲明了一個叫做 MyClass 的類,它繼承于基本類(或根類):NSObject。(根類可以被所有的其他類直接或間接繼承。)類聲明開頭是一條編譯器指令 @interface,結(jié)尾是一條 @end 指令。在類名稱后邊(中間用冒號分隔),是父類的名稱。在 Objective-C 中,每個類只能有一個父類。類中包含的實例變量(有時被稱為 ivar,在其他編程語言中有時被稱為成員變量)的聲明被一個花括號({ 和 })包裹起來。實例變量是可選的。在實例變量語句塊下邊是屬性(圖中沒有寫出來)和類的方法聲明。每個實例變量和方法聲明的語句結(jié)尾都要有一個分號。


圖 1 一段類聲明

類的實現(xiàn)的語法也是類似的。開頭是編譯器指令 @implementation(后面有類的名稱),結(jié)尾是 @end 指令。方法的實現(xiàn)代碼就在這兩個指令的中間。實現(xiàn)代碼中必須導(dǎo)入它的接口文件,寫在代碼的第一行。

#import “MyClass.h”
    @implementation MyClass
- (id)initWithString:(NSString *)aName
{
    // 在這里書寫代碼
}
    + (MyClass *)myClassWithString:(NSString *)aName
{
    // 在這里書寫代碼
}
@end

我們之前講過,Objective-C 支持包含對象的動態(tài)類型變量,它同時也支持靜態(tài)類性。靜態(tài)類型變量的聲明前邊要有所述類的名稱。而動態(tài)類型變量聲明以id 來代表對象。在某些情形下,你會用到動態(tài)類型變量。比如,一個數(shù)組這樣的對象集合(里面包含的對象類型可能是無法預(yù)知的)就會用到動態(tài)類型變量。這樣的變量能夠提供無比靈活的功能,使得 Objective-C 程序能夠擁有更大的動態(tài)性。

下面的例子展示了靜態(tài)類型和動態(tài)類型變量的聲明方式:

MyClass *myObject1;  // 靜態(tài)類性
    id       myObject2;  // 動態(tài)類型
    NSString *userName;  //曾出現(xiàn)在“你的第一個 iOS 應(yīng)用”中(靜態(tài)類型)

請注意第一個聲明里的 * 星號。在 Objective-C 語言中,對象永遠(yuǎn)是通過指針來引用的。如果現(xiàn)在你還不能明白這句話的意思也不必?fù)?dān)心,在學(xué)會Objective-C 基礎(chǔ)之后再研究指針也不遲。現(xiàn)在你需要記住的,是在靜態(tài)類型變量聲明時,變量名稱前面一定要有 * 星號。而 id 類型則暗示它是一個指針。

方法和消息

如果你剛剛開始接觸面向?qū)ο缶幊,不妨先把“方法”想象成每個對象特有的一個函數(shù)。通過向一個對象發(fā)送消息,你便調(diào)用了對象的某個方法。Objective-C 中有兩種方法:實例方法以及類方法。

·實例方法顧名思義,它的作用域僅在某個類的一個實例當(dāng)中。換句話說,在調(diào)用某個實例方法之前,你必須先創(chuàng)建一個實例才行。實例方法是常見的方法。
    ·類方法則是指其作用域包括該方法所在的整個類。它不要求某個對象的實例作為消息的接收者。

方法的聲明由以下幾個部分構(gòu)成:方法類型標(biāo)識符,返回類型,一個或多個方法簽名關(guān)鍵字,以及參數(shù)類型和名稱。下面的圖中是實例方法 insertObject:atIndex: 的聲明語句。

在實例方法中,聲明的開頭是一個 – 減號;而聲明類方法時前面要使用 + 加號。下文的“類方法”章節(jié)將詳細(xì)講述類方法的概念。

方法的名稱(insertObject:atIndex:)是一系列方法簽名關(guān)鍵詞聯(lián)結(jié)而成,包括冒號。冒號表示將會出現(xiàn)參數(shù)。在上面的例子中,這個方法含有兩個參數(shù)。如果某個方法沒有參數(shù),則需要將第一個(也是唯一一個)方法簽名關(guān)鍵詞后面的冒號省略掉。

當(dāng)你需要調(diào)用一個方法時,就是要向?qū)崿F(xiàn)了該方法的對象發(fā)送一個消息,簡而言之,就是給對象發(fā)送消息。(雖然“發(fā)送消息”常常用作“調(diào)用方法”的近義詞,但是在 Objective-C 的運行時中,實際情況是發(fā)送消息。)一個消息就是一個方法的名字帶上該方法所需的參數(shù)信息(要和數(shù)據(jù)類型正確對應(yīng))。你向?qū)ο蟀l(fā)送的所有消息都是動態(tài)調(diào)度的,以此來實現(xiàn) Objective-C 語言的多態(tài)性。(多態(tài)性是指:不同類型的對象都能對同一種消息做出回應(yīng)。)有時,所調(diào)用的方法是由接收消息的對象的類的父類實現(xiàn)的。

要調(diào)度一個消息,運行時要求正確的消息表達(dá)方式。消息表達(dá)式由一對方括號([ 和 ])把消息(以及所需的參數(shù))包裹起來,接收消息的對象寫在左邊括號后邊。比如,要向 myArray 變量所含的對象發(fā)送一個 insertObject:atIndex: 消息,你要按下面的語法進(jìn)行書寫:

[myArray insertObject:anObject atIndex:0];

為了避免聲明大量局部變量來存儲臨時結(jié)果,Objective-C 允許嵌套消息表達(dá)式。每個嵌套的表達(dá)式返回的值都會作為一個參數(shù),或者接收消息的對象,甚至是另一個消息。比如,你可以將上一個例子中的任意一個變量替換成用消息接收數(shù)值。這樣一來,如果你還有一個叫做 myAppObject 的對象,它含有訪問數(shù)組對象以及將對象插入數(shù)組的方法,你可以將那個例子改造成下面這樣:

[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];

Objective-C 還提供了點語法特性,用來訪問存取方法。存取方法是對象的 get 和 set 語句,這里是封裝的關(guān)鍵,封裝是所有對象的重要特性。對象把自己的狀態(tài)封裝(或隱藏)起來,并提供一個能讓所有實例訪問這個狀態(tài)的通用接口。利用點語法,之前的例子又可以被改寫成:

[myAppObject.theArray insertObject:myAppObject.objectToInsert atIndex:0];

點語法還可以用來賦值:

myAppObject.theArray = aNewArray;

這個語法其實是 [myAppObject setTheArray:aNewArray]; 這個語句的另一種表述方式,而且我們在之前的ios應(yīng)用開發(fā)基礎(chǔ)教程中,已經(jīng)用過點語法來對變量進(jìn)行賦值了:

self.userName = self.textField.text;

存取方法的使用會在明天關(guān)于“已聲明的屬性和存取方法”章節(jié)做詳細(xì)介紹。

類方法

雖然之前的范例都是向類的實例發(fā)送消息,但你也可以向類自身發(fā)送消息。(這里的類,可以被理解為由運行時生成的 類 的對象。)向一個類發(fā)送消息時,該方法必須在之前被聲明為類方法,而不是實例方法。類方法和 C++ 中的靜態(tài)方法很相似。

你通常會將類方法用作工廠方法,借以創(chuàng)建該類的新的實例或者訪問與該類相關(guān)的某些共有信息。類方法的聲明語法和實例方法的十分相像,不同之處是方法類型標(biāo)識符是一個 + 加號,而不是 – 減號。

下面的例子展示了如何把一個類方法當(dāng)作該類的工廠方法進(jìn)行調(diào)用。在本例中,array 方法是 NSArray 類的一個類方法,并且被 NSMutableArray 類繼承。它會給這個類的新實例分配內(nèi)存并將這個實例初始化,后把它返回給你的代碼。

NSMutableArray *myArray = nil; // nil 本質(zhì)上等同于 NULL

// 創(chuàng)建一個新數(shù)組,并將其賦值給 myArray 變量。

myArray = [NSMutableArray array];

 更多相關(guān)文章

·iOS開發(fā)入門:Objective-C基礎(chǔ)語法串講
·iOS開發(fā)入門:Objective-C語言簡介
·iOS 應(yīng)用程序開發(fā)教程:十、排除故障和檢查代碼
·iOS 應(yīng)用程序開發(fā)教程:九、實施視圖控制器
·iOS 應(yīng)用程序開發(fā)教程:八、讓應(yīng)用程序具有輔助功能