總結:.Net的C#移植到Cocoa Touch的Objective-C
從.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 語法與之對應。