Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged "iPhone"

在Windows上编写Object C程序

随着iphone的流行,越来越多的程序员开始学习Object C编程,但一般来说编写Object C需要iMac计算机。这对于刚开始学习Object C编程的程序员是个问题。

本文给出了一个在 windows 平台上学习Object C编程的方法。

1.下载GNUStep

http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/

下载

gnustep-msys-system-x.x.x-setup.exe

gnustep-core-x.x.x-setup.exe

gnustep-cairo-x.x.x-setup.exe

gnustep-devel-x.x.x-setup.exe

将下载的GNUStep安装,比如C:\GNUStep

2. 下载JEdit

http://www.jedit.org/index.php?page=download

JEdit 是Freeware,可以用来编辑 .m 文件 .m 是Object C缺省后缀。 .m 相当于 .c 文件

3. 一个Object C教材

http://www.otierney.net/objective-c.html

———————————————

4. 安装后,执行msys.bat 启动 GNUStep 环境 (类Linux环境)

5. 编写示例程序

fraction.h

#import <Foundation/NSObject.h>

@interface Fraction: NSObject {
     int numerator;
     int denominator;
 }

-(void) print;
 -(void) setNumerator: (int) n;
 -(void) setDenominator: (int) d;
 -(int) numerator;
 -(int) denominator;
 @end

fraction.m

#import "fraction.h"
 #import 

@implementation Fraction
 -(void) print {
     printf( "%i/%i", numerator, denominator );
 }

-(void) setNumerator: (int) n {
     numerator = n;
 }

-(void) setDenominator: (int) d {
     denominator = d;
 }

-(int) denominator {
     return denominator;
 }

-(int) numerator {
     return numerator;
 }
 @end

main.m

#import 
#import "fraction.h"

int main( int argc, const char *argv[] ) {
     // create a new instance
     Fraction *frac = [[Fraction alloc] init];

    // set the values
     [frac setNumerator: 1];
     [frac setDenominator: 3];

    // print it
     printf( "The fraction is: " );
     [frac print];
     printf( "\n" );

    // free memory
     [frac release];

    return 0;
 }

6. 编写Makefile

在当前目录下创建GNUmakefile

include $(GNUSTEP_MAKEFILES)/common.make

TOOL_NAME = Hello
 Hello_OBJC_FILES = main.m fraction.m

include $(GNUSTEP_MAKEFILES)/tool.make

6. 编译程序

$ make

将创建 obj目录 运行  hello.exe

The fraction is: 1/3

这样环境就搭好了,你就可以继续学习 Object C了

最终写iphone程序一般还是要Mac OS.

 

iphone 开发学习笔记七

本篇算是该系列最后一篇,虽不能说是很熟,但使用MonoTouch 开发的其本方法是掌握了,主要是完成当初的任务,实现地图开发包在iPhone上的实现。
使用MonoTouch ,.Net 代码很容易就可以在iPhone上运行,但iphone上 CoreGraphics 图形库的坐标原点在左下角,Y轴方向向上,和其它的图形系统不同,大部分图形系统坐标原点在左上方,Y轴方向向下,如果不注意,图象显示方向就不正确。
下图是在iPhone使用引路蜂地图演示程序的一个截图。
基于iOS, Mac OS 地图开发包将在不久的将来发布,敬请关注。其功能和它在Java ME,Android 平台类似,和iphone SDK 自带的 MapKit 功能主要在于引路蜂地图开发包支持多种地图类开型,离线地图,并可校正中国地图偏移等等

 

iphone 开发学习笔记六

结束了选择开发平台的思想斗争,最终选择MonoTouch. 最终的代码需要在iphone上测试,尽管可以使用iphone模拟器来开发,但模拟器和16实际的手机还是有很大的区别的。内存大小,CPU速度,关键的iphone模拟器和实际的手机所支持的API不同,iphone模拟器实际上是个Mac OS应用,很多在手机上不支持的库可以用在iphone模拟器,也就是与能在iphone模拟器上运行的代码不一定可以在iphone手机上运行。
当如果需要将程序部署到手机,就需要加入Apple iOS Member,每年需付$100,而MonoTouch软件的费用是$399,还不算太贵。
于是付款,正好赶上感恩节促销,MonoTouch打折20%。
MonoTouch付费版和试用版不同,需另外安装。
等装好软件后,在详细说明如何在手机上部署开发调试。
收到Apple 注册激活码后,激活居然没有成功,说是信用卡和注册信息不同。明明是一样的 。 经过一段时间的使用Mac OS, iphone, XCode, 明显感到Apple 的东西是中看不中用,对于终端用户可能不是什么问题,但对于开发人员来说不是个友好的开发环境。
今天苹果发信过来,可以激活了

 

iphone 开发学习笔记五

从.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 语法与之对应。

 

iphone 开发学习笔记四

从.Net C#到 Cocoa Touch Objective C 移植工作并不是很顺利,两个平台,两个语言的差异性实在太大,移植工作几乎是重写代码,整个代码量在10多万左右,几乎不可能在短时间内完成。在移植一小部分代码之后,经过仔细考虑,还是决定暂时放弃从Net C#到 Cocoa Touch Objective C 移植,转而采用MonoTouch 的方式有实现对iphone 平台的支持。结果出乎意料的顺利。原以为还需要对源码重新编译才可以在MonoTouch 中使用。但是实际应用中,C#库在MotoTouch 中是二进制兼容的。尽管MISL是个中间语言,但库MonoTouch 中支持了二进制兼容还是让我大为惊讶。也就是在使用Visual studio 在 Windows平台上编译并且扰码过的库可以直接被MotoTouch应用引用而不需要重新编译。
最终决定采用MonoTouch 作为iphone 应用开发工具。并将提供引路蜂地图开发包.

 

iphone 开发学习笔记三

经过一段时间的学习,看文档,算是对Mac OS,Objective C有了一些基本的了解,直正要学会iphone 开发还是要通过实战。在选择开发工具,对于选择XCode+Objective C 还是用 MonoTouch 几经反复,经过激烈的心理斗争,最终选择两种都支持 :-). 我的目标是将地图开发包移植到 iPhone (iOS)和 Mac OS上,原始代码是Java 和 C# ,似乎选择 MonoTouch 是个正确的选择,而且事实上.Net 平台上C#代码基本上可以不用修改在MonoTouch 编译通过,移植工作量很小,似乎没什么挑战性。另外经过几周的Objective C和 Cocoa Touch学习,对于开发人员来说XCode+Objecitve C实在不是什么好用的开发环境,Objective C本质上还是C,重新回到用C写代码真是不习惯,满脑的指针又回来。。。
但用MonoTouch 基本上没什么工作量,也就不能较深入的了解iOS,另外用MonoTouch也有两个比较大的缺点:一是编译后可执行程序较大,iphone不带.Net 运行环境,MonoTouch 编译后的程序需要包含MonoTouch运行环境,我查到网上一个资料,一个简单的”Hello world”,用Objective C写,最后大约50k,而用MonoTouch大约是5M. 另一个缺点可能是致命的,不是技术上的而是来自Apple限制,Apple在新的开发者协议中明确指出在iphone写程序只能是C,C++,Objective C或是JavaScripts,有点变态的规定,尽管Apple很难强制执行这个政策,但对用MonoTouch开发iphone 4还是一个很大的风险。最终我还是决定两个都支持。其实主要是支持Objective C 接口。MonoTouch 接口支持工作量很小。
下面就说说移植的工作量,在后面的文章中陆续介绍在移植中碰到的问题及解决方法,C#和Objective C是两种异常迥异的语言,.Net Framework 和 Cocoa Touch Framework 也大不相同。移植工作是一个非常有挑战性的工作:)。
下图是引路蜂地图开发包的包之间关系图。其中绿色为对外开放的API.
所用的平台API涉及到 String, Collections ( Array, Hashtable etc) (Util), Network (Http etc) ,Ajax (Json), 文件操作 (RMS),加密解密 (Crypto),二维图形 (Drawing) ,最后是地理信息系统(GIS)。
这些平台API在 .Net Framework 和 Cocoa Touch 实现不同,C#和 Objective C语法不同,都给移植增加了工作量。在之后的文章会慢慢介绍。