《Objective C 2 0程式設計》摘要

2021-05-24 04:59:23 字數 3047 閱讀 1105

可以使用名為gcc的gnu objective-c編譯器來編譯並鏈結這個程式,gcc命令一般的格式為:

gcc -framework foundation files -o progname

該選項說明你要使用有關foundation框架的資訊:

-framework foundation

objective-c是區分大小寫的

obj-c採用特定的語法對類和例項應用方法:[classorinstance method]

在這條語句中,左方括號要緊跟類的名稱或該類的例項的名稱,它後面可以是乙個或者多個空格,空格後面是將要執行的方法。請求乙個類或者例項來執行某個操作時,就是在向它傳送一條訊息。因此也可以表示為:

[receiver message]

@inte***ce定義的方法中,開頭的負號(-)通知obj-c編譯器,該方法是乙個例項方法。其他唯一的選擇是正號(+) 。類方法是對類本身執行某些操作的方法。

使用@property和@synthesize來自動生成設定函式方法和獲取函式方法。

關鍵字self用來指明物件是當前方法的接收者。類似c++的this

@class,使用@class關鍵字宣告乙個類,提高了效率,因為編譯器不需要處理整個類.h檔案;而只需要***是個類名字。如果需要引用***類中的方法,@class指令是不夠的,因為編譯器需要更多的資訊。需要知道該方法中有多少引數,它們是什麼型別,方法的返回型別是什麼。

關鍵字super,用來引用訊息接收者的父類。

@selector(alloc) 為名為alloc的方法聲稱乙個sel型別的值。要確定物件是否可以響應這個動作,可以使用respondstoselector。

@try, @catch(n***ception), @throw, @finally [exception name] [exception reason]

介面中可以宣告@protected(這個指令後面的例項變數可被該類及任何子類中定義的方法直接訪問,這是預設的情況); @private (可被定義的類的方法直接訪問,但是不能被子類中定義的方法直接訪問);@public(可被該類定義的方法直接訪問,也可被其他類或模組中定義的方法直接訪問,使得其他方法或函式可以通過使用指標運算子->訪問例項變數);@package(對於64位影象,可以在實現該類的影象的任何地方訪問這個例項變數)

有時,建立類只是使建立子類更容易。因此,這些類名為抽象類。例如foundation的nsnumber類是為了將數字作為物件處理而建立的抽象類。整數和浮點數字通常有不同的記憶體需求。每種數字型別都有單獨的nsnumber子類。因為這些子類屬於nsnumber類,總起來名為簇(cluster)。向nsnumber類傳送訊息來建立新的整數物件時,使用合適的子類為整數物件分配必需的空間,並正確的設定其值。這些子類實際上是私有的。你自己無法直接訪問這些子類,只能通過抽象的超類間接訪問。

分類(category)提供了乙個方式,用它可以將類的定義模組化到相關方法的組或者分類中。它還提供了擴充套件現有類定義的簡便方式,並且不必訪問類的源**,也無需建立子類。

關於分類有幾點值得注意,首先,儘管分類可以訪問原始類的例項,變數,但是它不能新增自身的任何變數,如果需要新增變數,可以考慮建立子類;另外,分類可以過載該類中的另乙個方法,但是通常認為這種做法是拙劣的設計習慣。其一,過載了乙個方法以後,再也不能訪問原來的方法。因此,必須小心地將被過載方法中的所有功能複製到替換方法中。如果確實需要過載方法,正確的選擇可能是建立子類。如果在子類中過載方法,仍然可以通過向super傳送訊息來引用父類的方法;和一般介面方法不同的是,不必實現分類中的所有方法。這對於程式擴充套件很有用,因為可以在該分類中宣告所有方法,然後在一段時間之後才實現它。

協議(protocol)是多個類共享的乙個方法列表。協議中列出的方法沒有相應的實現。如果定義了自己的協議,則不必由自己實際實現它。但是,這就告訴其他程式設計師:如果要採用這項協議,則必須實現這些方法。這些方法可以從超類繼承;可以在@protocol中使用@optional指令,下面列出的所有方法的指令都是可選的,之後可以在協議內定義@required指令來列出需要的方法。

可以使用conformstoprotocol方法檢查乙個物件是否遵循某項協議;定義一項協議時,可以擴充套件現有協議的定義,所以以下協議定義:

@protocol drawing3d

說明drawing3d協議也採用了drawing協議。因此,任何採用drawing3d協議的類都必須實現此協議列出的方法

分類也可以採用一項協議,如:@inte***ce fraction (stuff)

非正式協議實際上僅僅是乙個名稱之下的一組方法。前面描述的@optional指令新增到了obj-c 2.0語言中,用於取代非正式協議的使用。

id型別是一種通用的物件型別。為什麼不把所有的物件都宣告為id型別呢?使用靜態型別時,編譯器盡可能確保變數的用法在程式中始終保持一致。編譯器通過檢查來確定應用於物件的方法是由該類定義的或者由該類繼承,否則它顯示警告資訊。靜態型別是因為它能更好地在程式編譯階段而不是在執行時指出錯誤。使用靜態型別的另乙個原因是它能夠提高程式的可讀性。

id型別是通用指標型別:因為通過指標,也就是記憶體位址來引用物件,所以可以自由地將它們在id變數之間來回賦值。因此返回id型別值的方法只是返回指向記憶體中某物件的指標。然後可以將該值賦給任何物件變數。因為無論在**,物件總是攜帶它的isa成員,所以即使將它儲存在id型別的通用物件變數中,也總是可以確定它的類。

自動釋放池可以自動釋放新增到該池中的物件所使用的記憶體。向物件傳送一條autorelease訊息時,就將該物件放到這個池中。釋放這個池時,新增到該池的所有物件也會一起釋放。

當物件的引用計數達到0時,系統就知道不再需要這個物件,因此系統就會釋放它的記憶體,這是通過向物件傳送一條dealloc訊息而實現的。

通過向物件傳送retaincount訊息,可以獲得這個物件的引用計數。

如果你的方法中不再需要乙個物件,但需要返回它,那麼向其傳送一條autorelease訊息,將它標記為以後釋放。訊息autorelease並不影響物件的引用計數。因此它允許訊息的傳送者使用這個物件,然後仍然在以後當自動釋放池時,釋放這些物件。

如果使用alloc或者copy方法(或使用allocwithzone,copywithzone或mutablecopy方法)直接建立物件,則由你負責釋放它。每次retain物件時,應該release或者autorelease它。

《Objective C 2 0程式設計》摘要

可以使用名為gcc的gnu objective c編譯器來編譯並鏈結這個程式,gcc命令一般的格式為 gcc framework foundation files o progname 該選項說明你要使用有關foundation框架的資訊 framework foundation objective...

Objective C 2 0資料型別

整形資料 int objective c中的int型可以儲存正的或者負的整數 即沒有小數字 整形 int 的位數依賴於目標機,在編譯期決定,一般是32位或者64位,這個取決於程式執行平台的cpu。值得注意的是,有時候作業系統也會起到作用,比如,cpu是64位,但是跑的作業系統是32位的,那麼int只...

Objective C 2 0資料型別

整形資料 int objective c中的int型可以儲存正的或者負的整數 即沒有小數字 整形 int 的位數依賴於目標機,在編譯期決定,一般是32位或者64位,這個取決於程式執行平台的cpu。值得注意的是,有時候作業系統也會起到作用,比如,cpu是64位,但是跑的作業系統是32位的,那麼int只...