總結(jié):.Net的C#移植到Cocoa Touch的Objective-C
從.Net C#到 Cocoa Touch Objective C的移植工作進(jìn)行得比較緩慢,完成了二維圖形庫(kù)內(nèi)部類大約20多個(gè)類的移植,工作量太量,最終決定放棄,這里對(duì)移植工作作個(gè)小結(jié),以作為以后移植工作參考。
1.Name space
Objective-C 不支持命令空間,而是采用前綴的方式來(lái)避免命名沖突。在C#庫(kù)有外部類和內(nèi)部類之分,開發(fā)包中內(nèi)部類一般有internal 或是不想對(duì)開發(fā)人員開放的類。在移植到 Objective-C 時(shí),可以采用兩套前綴的方式來(lái)解決這個(gè)問題,比如采用GD (Guidebee)作為內(nèi)部類前綴,MD (Mapdigit)作為外部類前綴,最后發(fā)布開發(fā)包時(shí),只提供MD開頭的頭文件。開發(fā)包使用都無(wú)法得知GD開頭的類,也就實(shí)現(xiàn)了隱藏內(nèi)部類的目的。
2.抽象類
Objective-C 中沒有抽象類的概念,移植時(shí)可以直接用普通類代替,如果不想在代碼在有這個(gè)抽象類的實(shí)例,可以實(shí)現(xiàn)init 方法,使其拋出異常。
3.類常量
在 C# 類中常常會(huì)定義一些類常量,而在 Objective-C中不支持,這時(shí)可以用宏來(lái)實(shí)現(xiàn)
比如
- 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
則對(duì)應(yīng)于 Objective 的 Protocol
5.C# 類中私用方法
一是在Objective-C頭文件中不要定義這些私有方法,直接定義在.m 文件中。這樣可以實(shí)現(xiàn)對(duì)這些方法的隱藏。
二是采用 Objective-C的私有 Category 來(lái)實(shí)現(xiàn)私有方法。
6.Array Copy
Objective-C 中沒有提供 Array.Copy 方法,我在移植時(shí),采用的是 memcpy 來(lái)實(shí)現(xiàn)對(duì)數(shù)組的拷貝
7.構(gòu)造函數(shù)和析構(gòu)函數(shù)
由于Objective-C 不支持重載和對(duì)內(nèi)存的自動(dòng)管理。
對(duì)于C#中構(gòu)造函數(shù)移植到Objective-C時(shí)
采用initXXX 命名方法,如果類中有NSObjective 派生類,注意加上dealloc 來(lái)釋放內(nèi)存,以免造成內(nèi)存泄漏。
比如LineFP有構(gòu)造函數(shù)
- public LineFP();
- public LineFP(LineFP l);
- public LineFP(PointFP p1, PointFP p2);
- public LineFP(int ffX1, int ffY1, int ffX2, int ffY2);
對(duì)應(yīng)的Objective-C GDLineFP.h 中可以定義下列構(gòu)造函數(shù)
- -(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 在不同平臺(tái)上定義不同,盡量使用 int32_t, int64_t 來(lái)定義。
9. 類變量定義
在C#類可以定義Static類變量,而在Objective-C 中無(wú)法定義類變量,這時(shí)可以將類變量定義于類定義之外,在頭文件中使用extern 。
10. 靜態(tài)構(gòu)造函數(shù)
在Objective-C 中可以使用 +(initialize) 來(lái)實(shí)現(xiàn),+(initialize) 在類初始化前執(zhí)行,但如果該類有子類時(shí)要注意。在子類初始化前+(initialize) 也會(huì)執(zhí)行,如果要實(shí)現(xiàn)singleton時(shí)注意不要執(zhí)行多次。
11. Math 類
在Cocoa Foundation類中無(wú)對(duì)應(yīng)類支持,必需使用 Math.h 中 C接口。
12. 對(duì)于返回類對(duì)象的函數(shù)
由于Objeictive-C需要手工管理內(nèi)存,一般是采用誰(shuí)創(chuàng)建誰(shuí)釋放的原則,對(duì)于返回類對(duì)象的函數(shù)由于不知道調(diào)用者什么時(shí)候使用完該類對(duì)象,一般需使用autorelease pool ,這個(gè)需要好好研究一下Objective-C 的內(nèi)存管理機(jī)制,否則可以造成內(nèi)存泄漏。
其它的C#語(yǔ)法基本上可以找到對(duì)應(yīng)的Objective-C 語(yǔ)法與之對(duì)應(yīng)。