從.Net C#到 Cocoa Touch Objective C的移植工作進行得比較緩慢,完成了二維圖形庫內部類大約20多個類的移植,工作量太量,最終決定放棄,這裡對移植工作作個小結,以作為以後移植工作參考。
1. Name space
Objective C 不支援命令空間,而是採用首碼的方式來避免命名衝突。在C#庫有外部類和內部類之分,開發包中內部類一般有internal 或是不想對開發人員開放的類。在移植到 Objective C 時,可以採用兩套首碼的方式來解決這個問題,比如採用GD (Guidebee)作為內部類首碼,MD (Mapdigit)作為外部類首碼,最後發布開發包時,只提供MD開頭的標頭檔。開發包使用都無法得知GD開頭的類,也就實現了隱藏內部類的目的。
2. 抽象類別
Objective C 中沒有抽象類別的概念,移植時可以直接用普通類代替,如果不想在代碼在有這個抽象類別的執行個體,可以實現init 方法,使其拋出異常。
3 類常量
在 C# 類中常常會定義一些類常量,而在 Objective C中不支援,這時可以用宏來實現
比如
internal class SingleFP
{
/**
* Positive Infinity.
*/
private const int PositiveInfinity = int.MaxValue;
/**
* Negative infinity.
*/
private const int NegativeInfinity = int.MinValue;
。。。
}
可以在GDSingleFP.h 中定義
/**
* Positive Infinity.
*/
#define GDSingleFP_PositiveInfinity INT_MAX
/**
* Negative infinity.
*/
#define GDSingleFP_NegativeInfinity INT_MIN
宏加上GDSingleFP 可以避免可能命名衝突。
4. C # Interface
則對應於 Objective 的 Protocol
5. C# 類中私用方法
一是在Objective C標頭檔中不要定義這些私人方法,直接定義在.m 檔案中。這樣可以實現對這些方法的隱藏。
二是採用 Objective C的私人 Category 來實現私人方法。
6. Array Copy
Objective C 中沒有提供 Array.Copy 方法,我在移植時,採用的是 memcpy 來實現對數組的拷貝
7. 建構函式和解構函式
由於Objective C 不支援重載和對記憶體的自動管理。
對於C#中建構函式移植到Objective C時
採用initXXX 命名方法,如果類中有NSObjective 衍生類別,注意加上dealloc 來釋放記憶體,以免造成記憶體流失。
比如LineFP有建構函式
public LineFP();
public LineFP(LineFP l);
public LineFP(PointFP p1, PointFP p2);
public LineFP(int ffX1, int ffY1, int ffX2, int ffY2);
對應的Objective C GDLineFP.h 中可以定義下列建構函式
-(GDLineFP *) init;
-(GDLineFP *) initWithLineGDLine *)l;
-(GDLineFP *) initWithP1GDPointFP *)p1 P2GDPointFP *)p2;
-(GDLineFP *) initWithX1int32_t) ffX1 Y1int) ffY1 X2int) ffX2 Y2int) ffY2;
8. int ,long
為避免int ,long 在不同平台上定義不同,盡量使用 int32_t, int64_t 來定義。
9. 類變數定義
在C#類可以定義 Static 類變數,而在Objective C 中無法定義類變數,這時可以將類變數定義於類定義之外,在標頭檔中使用 extern 。
10. 靜態建構函式
在Objective C 中可以使用 +(initialize) 來實現,+(initialize) 在類初始化前執行,但如果該類有子類時要注意。在子類初始化前+(initialize) 也會執行,如果要實現singleton時注意不要執行多次。
11. Math 類
在Cocoa Foundation類中無對應類支援,必需使用 Math.h 中 C介面。
12. 對於返回類對象的函數
由於Objeictive C需要手工管理記憶體,一般是採用誰建立誰釋放的原則,對於返回類對象的函數由於不知道調用者什麼時候使用完該類對象,一般需使用 autorelease pool ,這個需要好好研究一下Objective C 的記憶體管理機制,否則可以造成記憶體流失。
其它的C#文法基本上可以找到對應的Objective C 文法與之對應
摘自 引路蜂移動軟體