iphone 開發學習筆記五

2021-08-26 22:17:43 字數 2271 閱讀 2422

從.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

可以在gdsinglefp.h 中定義

/*** positive infinity.

*/#define gdsinglefp_positiveinfinity int_max

/*** negative infinity.

*/#define gdsinglefp_negativeinfinity int_min

巨集加上gdsinglefp 可以避免可能命名衝突。

4. c # inte***ce

則對應於 objective 的 protocol

5.  c# 類中私用方法

一是在objective c標頭檔案中不要定義這些私有方法,直接定義在.m 檔案中。這樣可以實現對這些方法的隱藏。

二是採用 objective c的私有 category 來實現私有方法。

6. array copy

objective c 中沒有提供 array.copy 方法,我在移植時,採用的是 memcpy 來實現對陣列的拷貝

7. 建構函式和析構函式

由於objective c 不支援過載和對記憶體的自動管理。

對於c#中建構函式移植到objective c時

採用init*** 命名方法,如果類中有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 語法與之對應

iphone 開發學習筆記六

結束了選擇開發平台的思想鬥爭,最終選擇monotouch.最終的 需要在iphone上測試,儘管可以使用iphone模擬器來開發,但模擬器和16實際的手機還是有很大的區別的。記憶體大小,cpu速度,關鍵的iphone模擬器和實際的手機所支援的api不同,iphone模擬器實際上是個mac os應用,...

iphone 開發學習筆記六

結束了選擇開發平台的思想鬥爭,最終選擇monotouch.最終的 需要在iphone上測試,儘管可以使用iphone模擬器來開發,但模擬器和16實際的手機還是有很大的區別的。記憶體大小,cpu速度,關鍵的iphone模擬器和實際的手機所支援的api不同,iphone模擬器實際上是個mac os應用,...

iphone 開發學習筆記六

結束了選擇開發平台的思想鬥爭,最終選擇monotouch.最終的 需要在iphone上測試,儘管可以使用iphone模擬器來開發,但模擬器和16實際的手機還是有很大的區別的。記憶體大小,cpu速度,關鍵的iphone模擬器和實際的手機所支援的api不同,iphone模擬器實際上是個mac os應用,...