XCode:你可以把它看成是一個開發環境,就好像Visual Studio或者Netbeans或者SharpDevelop一樣的玩
意。你可以將Interface Builder認為是Visual Studio中用來畫介面的那部分功能單獨提出來的程式。
Objective-C:這是一種語言,就好像c++是一種語言,Java是一種語言,c#是一種語言,鶯歌曆史也是一
種語言一樣。
Cocoa:是一大堆函數庫,就好像MFC、.NET、Swing這類玩意,人家已經寫好了一堆現成的東西,你只要
知道怎麼用就可以了。
減號表示一個函數、或者方法、或者訊息的開始
括弧可以認為是如何調用你剛才寫的這個方法,通常在Objective-C裡說“訊息”。
同一個數組可以儲存不同的對象
C用NULL,OC用nil
Objective-C 有種叫做 id 的型別,它的運作有時候像是 void*,不過它卻嚴格規定只能用在對象。
基本類別庫 import NSObject.h;BOOL型為YES or NO
#import vs #include:#import。#import 由 gcc 編譯器支援。我並不建議使用 #include,#import 基
本上跟 .h 檔頭尾的 #ifndef #define #endif 相同。
Objective-C 的預設副檔名是 .m
類:@interface... @end
Implementation 以 @implementation ClassName 開始,以 @end 結束,用來定義類裡的函數
繼承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject
在 Objective-C 中呼叫 methods 的方法是 [object method],就像 C++ 的 object->method()
[object init] 是一個建構子(constructor)呼叫,負責初始化對象中的所有變數。
[frac setNumerator: 1] 非常簡單。它呼叫了 frac 上的 setNumerator method 並傳入 1 為參數
Objective-C 也有一個用以釋放記憶體的方式: release
傳遞多重參數用set..and:[frac2 setNumerator: 1 andDenominator: 5];單重時只用set
加入其它參數的方法就跟加入第二個時一樣,即 method:label1:label2:label3: ,而呼叫的方法是 obj
method: param1 label1: param2 label2: param3 label3: param4]
建構子(Constructors)
@interface 裡的宣告就如同正常的函式
@implementation 使用了一個新的關鍵詞:super
使用 [super init] 來存取 Super constructor,這個動作需要適當的繼承設計
存取許可權
預設的許可權是 @protected
就像 C++ 中 private: [list of vars] public: [list of vars] 的格式,它只是改成了@private,
@protected, 等等
Class level access
static int count = 0; 這是 class variable 宣告的方式。+(int) initCount; 這是回傳 count 值的
實際 method。+(void) initialize method is 在 Objective-C 開始執行你的程式時被呼叫,而且它也
被每個 class 呼叫。
異常情況(Exceptions)
注意:異常處理只有 Mac OS X 10.3 以上才支援
Exceptions(異常情況)的丟出不需要擴充(extend)NSException 對象,你可簡單的用 id 來代表它:
@catch ( id e ) { ... }
繼承、多型(Inheritance, Polymorphism)以及其它對象導向功能
Objective-C 與 Java 跟 C++ 不一樣,你在呼叫一個對象的 method 時,並不需要知道這個對象的型別
。當然這個 method 一定要存在,這稱為 Objective-C 的訊息傳遞。你不需要知道你呼叫 method 的那
個東西是什麼型別,如果這個對象對這個訊息有反應,那就會喚起這個 method。
繼承(Inheritance)
當你擴充你的 super class(所以只能有一個 parent),你想自訂這個 super class 的 method,只要
簡單的在你的 child class implementation 裡放上新的實作內容即可。
動態識別(Dynamic types)
如-(BOOL) isKindOfClass: classObj,即is object a descendent or member of classObj
Categories
當你想要為某個 class 新增 methods,你通常會擴充(extend,即繼承)它。然而這不一定是個完美解
法,特別是你想要重寫一個 class 的某個功能,但你卻沒有原始碼時。Categories 允許你在現有的
class 加入新功能,但不需要擴充它。Ruby 語言也有類似的功能。包括-(Fraction*) add: (Fraction*)
f; -(Fraction*) mul: (Fraction*) f; -(Fraction*) div: (Fraction*) f; -(Fraction*) sub:
(Fraction*) f;等
Posing
Posing 有點像 categories,但是不太一樣。它允許你擴充一個 class,並且全面性地的扮演(pose)這
個 super class。如果你讓 NSArrayChild 扮演 NSArray,則在你的程式碼中所有的 NSArray 都會自
動被替代為 NSArrayChild。[FractionB poseAsClass: [Fraction class]];
Protocols
Objective-C 裡的 Protocol 與 Java 的 interface 或是 C++ 的 purely virtual class 相同。
protocol 的宣告十分簡單,基本上就是 @protocol ProtocolName (methods you must implement) @end
要遵從(conform)某個 protocol,將要遵從的 protocols 放在 <> 裡面,並以逗點分隔。如:
@interface SomeClass <Protocol1, Protocol2, Protocol3> 。
protocol 要求實作的 methods 不需要放在 header 檔裡面的 methods 列表中。
可以使用 @protocol 來測試對象是否遵從介面。如果對象遵從這個介面,[object conformsToProtocol:
@protocol( SomeProtocol )] 會回傳一個 YES 型態的 BOOL 對象。
記憶體管理
Retain and Release(保留與釋放)
Retain 以及 release 是兩個繼承自 NSObject 的對象都會有的 methods。每個對象都有一個內部計數器
,可以用來追蹤對象的 reference 個數。如果對象有 3 個 reference 時,不需要 dealloc 自己。但是
如果計數器值到達 0 時,對象就得 dealloc 自己。[object retain] 會將計數器值加 1(值從 1 開始
),[object release] 則將計數器值減 1。如果呼叫 [object release] 導致計數器到達 0,就會自動
dealloc。
你可以呼叫 [obj retainCount] 來取得計數器的 int 值。
Dealloc
當你的對象包含其它對象時,就得在 dealloc 自己時釋放它們。Objective-C 的一個優點是你可以傳遞
訊息給 nil,所以不需要經過一堆防錯測試來釋放一個對象。
每個 set method 裡的三個動作的順序非常重要。假設你把自己當參數傳給一個自己的 method(有點怪
,不過確實可能發生)。若你先 release,「然後」才 retain,你會把自己給解構(destruct,相對於
建構)!這就是為什麼應該要 1) retain 2) release 3) 設值 的原因
Autorelease Pool
當你想用 NSString 或其它 Foundation framework classes 來做更多程式設計工作時,你需要一個更有
彈性的系統,也就是使用 Autorelease pools。當開發 Mac Cocoa 應用程式時,autorelease pool 會自
動地幫你設定好。
#import <Foundation/NSAutoreleasePool.h>
在 Objective-C 有兩種管理記憶體的方法, 1) retain and release or 2) retain and
release/autorelease。對於每個 retain,一定要對應一個 release 「或」一個 autorelease。
Foundation framework classes
Foundation framework 地位如同 C++ 的 Standard Template Library。不過 Objective-C 是真正的動
態識別語言(dynamic types),所以不需要像 C++ 那樣肥得可怕的樣版(templates)。這個 ramework
包含了對象組、網路、執行緒,還有更多好東西。
NSArray
數組有兩種(通常是 Foundation classes 中最資料導向的部分),NSArray 跟 NSMutableArray,顧名
思義,mutable(善變的)表示可以被改變,而 NSArray 則不行。這表示你可以製造一個 NSArray 但卻
不能改變它的長度。
NSArray *arr = [[NSArray alloc] initWithObjects: @"Me", @"Myself", @"I", nil];
排序(sorting)展示如何用 selector 來排序一個對象
NSEnumerator 很像 Java 的列舉系統
NSDictionary
#import <Foundation/NSDictionary.h> (不明白包含哪些東東)
注意: 資料來源於互連網