從.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 語法與之對應
摘自 引路蜂移動軟件