object-c小結

XCode:可以把它看成是一個開發環境,就好像Visual Studio或者Netbeans或者SharpDevelop一樣的玩意。可以將Interface Builder認爲是Visual Studio中用來畫界面的那部分功能單獨提出來的程序。

Objective-C:這是一種語言,就好像c++是一種語言,Java是一種語言,c#是一種語言,鶯歌歷史也是一種語言一樣。

Cocoa:是一大堆函數庫,就好像MFC.NETSwing這類玩意,人家已經寫好了一堆現成的東西,你只要知道怎麼用就可以了。

減號表示一個函數、或者方法、或者消息的開始括號可以認爲是如何調用你剛纔寫的這個方法,通常在Objective-C裏說消息
同一個數組可以保存不同的對象

CNULL,OCnil

Objective-C 有種叫做 id 的型別,它的運作有時候像是 void*,不過它卻嚴格規定只能用在對象。

基本類別庫 import NSObject.hBOOL型爲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
(異常情況)的丟出不需要擴充(extendNSException 對象,你可簡單的用 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# 的列舉系統

NSDictionary
#import <Foundation/NSDictionary.h>
(不是很明白包含哪些東東)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章