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 以 @implementationClassName
開始,以 @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; 這是 classvariable
宣告的方式。+(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 與 C# 跟 C++ 不一樣,你在呼叫一個對象的 method 時,並不需要知道這個對象的型別。當然這個 method 一定要存在,這稱爲 Objective-C 的訊息傳遞。你不需要知道你呼叫 method 的那個東西是什麼型別,如果這個對象對這個訊息有反應,那就會喚起這個 method。
繼承(Inheritance)
當你擴充你的 super class(所以只能有一個 parent),你想自訂這個 super
class 的 method,只要簡單的在你的 child classimplementation
裏放上新的實作內容即可。
動態識別(Dynamic types)
如-(BOOL) isKindOfClass:classObj,即is object a descendentor 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 的宣告十分簡單,基本上就是 @protocolProtocolName (methods you must implement) @end 要遵從(conform)某個
protocol,將要遵從的 protocols
放在 <>
裏面,並以逗點分隔。如:@interface SomeClass <Protocol1,Protocol2, Protocol3>
。
protocol 要求實作的 methods
不需要放在 header
檔裏面的 methods
列表中。
可以使用 @protocol
來測試對象是否遵從接口。如果對象遵從這個接口,[objectconformsToProtocol:
@protocol( SomeProtocol )] 會回傳一個 YES
型態的 BOOL
對象。
內存管理
Retain and Release(保留與釋放)
Retain 以及 release
是兩個繼承自 NSObject
的對象都會有的 methods。每個對象都有一個內部計數器,可以用來追蹤對象的 reference
個數。如果對象有 3
個 reference
時,不需要 dealloc
自己。但是如果計數器值到達 0
時,對象就得 dealloc
自己。[objectretain]
會將計數器值加 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
來做更多程序設計工作時,你需要一個更有彈性的系統,也就是使用 Autoreleasepools。當開發 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 很像 C#
的列舉系統
#import <Foundation/NSDictionary.h> (不是很明白包含哪些東東)