总结:.Net的C#移植到Cocoa Touch的Objective-C
来源:互联网 发布:淘宝有哪些冷门的类目 编辑:程序博客网 时间:2024/05/18 06:08
从.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 语法与之对应。
- 总结:.Net的C#移植到Cocoa Touch的Objective-C
- 我们把 iOS 的 Cocoa Touch 移植到了 Android
- Objective-C Cocoa的delegate机制解释
- Objective-C 的语法与 Cocoa 框架
- Cocoa入门-objective-c的读书笔记3
- Xcode,Objective-c,Cocoa的区别
- Cocoa和Cocoa Touch的区别
- cocoa和cocoa Touch的区别
- cocoa和cocoa Touch的区别
- cocoa和cocoa Touch的区别
- cocoa和cocoa Touch的区别
- VB.NET的模块移植到C#的解决办法
- objective-c的总结
- Programming in Objective-C 学习笔记10——Cocoa, Cocoa Touch and the iOS SDK
- Objective-C程序设计(第4版)学习笔记之20-Cocoa和Cocoa Touch简介
- Cocoa入门 使用objective-c 书上的错误例子
- Cocoa、Foundation、UIKit、Objective-c、XCode、Interface Builder的概念
- Objective-C 2.0 with Cocoa Foundation--- 6,NSObject的奥秘
- .NET中安装SVN
- html5 -(Web 存储)-02
- Jenkins Build Pipeline View点击Job跳转到具体某个build中
- Nutch命令
- JPetStore5.0——项目配置过程记录
- 总结:.Net的C#移植到Cocoa Touch的Objective-C
- 双点弦截法迭代程序
- 关于WinForm中的DataGridView控件显示数据字典的解决方案。
- BIEE 11g 新特性Double Colunm案例一则 动态切换金额显示单位
- Difference between MRP vs MPS
- json字符串转换为Array or List
- 十招教你从程序员转向企业家
- Spring MVC 拦截器
- BIEE叙述图导航实例