总结:.Net的C#移植到Cocoa Touch的Objective-C

移动开发 iOS
本文将讲述如何完成从.Net的C#到Cocoa Touch的Objective-C移植,整个过程非常缓慢,完成了二维图形库内部类大约20多个类的移植,工作量太量,虽然最终决定放弃,但是对于开发者还是有很多帮助的。

从.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中不支持,这时可以用宏来实现

比如

  1. internal class SingleFP 
  2.  
  3.  
  4. /** 
  5.  
  6. * Positive Infinity. 
  7.  
  8. */ 
  9.  
  10. private const int PositiveInfinity = int.MaxValue; 
  11.  
  12. /** 
  13.  
  14. * Negative infinity. 
  15.  
  16. */ 
  17.  
  18. private const int NegativeInfinity = int.MinValue; 
  19.  
  20. 。。。 
  21.  

可以在GDSingleFP.h 中定义

  1. /** 
  2.  
  3. * Positive Infinity. 
  4.  
  5. */ 
  6.  
  7. #define GDSingleFP_PositiveInfinity INT_MAX 
  8.  
  9. /** 
  10.  
  11. * Negative infinity. 
  12.  
  13. */ 
  14.  
  15. #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有构造函数

  1. public LineFP(); 
  2.  
  3. public LineFP(LineFP l); 
  4.  
  5. public LineFP(PointFP p1, PointFP p2); 
  6.  
  7. public LineFP(int ffX1, int ffY1, int ffX2, int ffY2); 

对应的Objective-C GDLineFP.h 中可以定义下列构造函数

  1. -(GDLineFP *) init; 
  2.  
  3. -(GDLineFP *) initWithLineGDLine *)l; 
  4.  
  5. -(GDLineFP *) initWithP1GDPointFP *)p1 P2GDPointFP *)p2; 
  6.  
  7. -(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 语法与之对应。

责任编辑:佚名 来源: imobilebbs
相关推荐

2011-05-11 15:19:01

CocoaObjective-C

2011-08-15 16:09:44

Cocoa对象Objective-C

2011-07-28 18:11:18

Objective-C Cocoa 编程

2015-06-25 11:21:33

C++Objective-C

2011-08-04 13:55:10

Cocoa Objective- 文件

2014-07-01 09:22:01

SwiftObjective-CiOS

2016-03-30 09:56:07

c语言变量声明objectivec

2013-04-11 13:41:30

Objective-CiOS编程

2014-11-25 10:18:17

Objective-C

2014-07-29 09:44:35

2011-08-10 18:07:29

Objective-C反射

2012-01-18 10:13:50

Objective-CiOSself

2011-05-11 11:20:26

Objective-C

2013-03-27 12:54:00

iOS开发Objective-C

2013-06-20 10:40:32

Objective-C实现截图

2011-05-11 15:58:34

Objective-C

2011-12-12 13:22:51

CocoaObjective-C

2015-07-08 10:47:57

Using Swift CocoaObjective-C

2011-08-04 10:57:33

Objective-C C语言 BOOL

2014-04-28 09:56:56

Objective-CiOS命名空间
点赞
收藏

51CTO技术栈公众号