iphone 开发学习笔记
iphone 开发学习笔记一前不久完成了在Java ME,BlackBerry, Android, Java SE, .Net CE, .Net Desktop平台上地图开发包开发工作。终于有时间开始学习Mac OS, iPhone开发。最终目标是将地图开发包移植到Mac OS 和 iPhone平台上。
做软件开发很多年来,一直没有机会接触Mac OS,模糊的印象是用苹果计算机主要是用于图形开发设计:-)。最近开始用iMac,尽管开始有些不习惯,但还是充分感到苹果计算机界面的优美。
先说一下开发iphone应用的一些准备工作。
一台 iMac ,我用的是一台 24 inch All -in -One 价格在 $1600-$2000
一部 iPhone , 价格 $600-$800
下载并安装 XCode, Interface builder 需要注册一个帐号,才可以在Apple 网站上下载
下载Get Start Video 总长近 20多个小时的教程。对于入门非常有用,每天晚上看3集,一周可看完。
几本人门级的书。
另外,如果打算在Apple Store上发布应用的话,需要每年向苹果缴纳注册费$100.
从移植的角度看,MonoTouch 提供了用于 iphone 的 .NET 开发环境,软件使用许可$399. 经过初步研究,MonoTouch是一个很好的选择,而且它也提供了从C#生产 Object C的工具(还没研究:-)。如果只是在模拟器上运行,可免费使用,如要发布软件,$399还是需要的。
从上看出开发iphone初始投资在$3000左右。
不管是不是使用MonoTouch ,熟悉Mac OS 和 Objective C都是必须的。
[ 本帖最后由 trisun 于 24-10-2010 16:16 编辑 ] 建议看一本书评价较好的
cocoa programming for mac osx
作者:Aaron Hillegass 原帖由 rommi 于 20-10-2010 16:20 发表 http://www.freeoz.cn/ibbs/images/common/back.gif
建议看一本书评价较好的
cocoa programming for mac osx
作者:Aaron Hillegass
我一般先看一下入门级的书,用于了解一下新的平台。入门级的书一般很便宜,后面一般就不看纸质的书,直接看在线文档了:lol 我在公司做过一些PC往mac方向的移植
不过没有接触过iphone开发
不过 我们不用工具 纯手工移植 c++ mfc代码还好
.net就苦了 先先用native c++重新实现managed code然后在移到mac上
相当痛苦:Q
回复 #1 trisun 的帖子
我也想捣鼓iPhone/iPad的应用开发,其中成本投入最大的就是iMac/Macbook,经济紧张的同学可以试试PC上装MacOS:http://bbs.weiphone.com/read-htm-tid-517742.html
我试了一下,可以在X200上装起来,不过显卡和无线网卡的驱动比较麻烦,声卡的驱动应该比较简单,但是作为app开发机,也勉强能用。
当然体验完之后,还是得攒钱买mac;P ;P mac 应该还可以吧
毕竟配套送了很多软件
你想想单买一个visual studio就多少钱了:lol
当然咯 这些不适合中国国情:lol 呵呵,这两天刚刚在windows7上用虚拟机装了个Mac OS X, 速度还真不错, 正准备捣鼓捣鼓iphone开发呢
iphone 开发学习笔记二
用于Mac OS 和 iphone 的开发环境主要是XCode 和 Interface Builder ,在XCode 3.0之前,XCode 和 Interface Builder是两个相对独立的应用,一个主要用来编写代码,一个主要用来设计用户界面,从XCode 4.0开始 Interface Builder被集成在XCode中。再谈谈用于Mac OS 和 iphone 的开发的开发语言 Objective C,这里也不想比较Objective C和其它语言C#,Java的优劣点,不同的人有不同的观点。根据Apple的文档说 Objective C最大的一个特点是动态性能,Dynamic Message Dispacth, Dynamic Binding等等。
这里主要给以熟悉C++,Java,C#语言的开发人员一些提醒,Objective C也是一种面向对象的编程语言,但是它和它的堂兄C++很不相同,更大程序上更象C语言。
1. Objective C仍然大量使用指针,而且很多情况下需要手工管理内存。尽管Mac OS上提供了 Garbage collector, 但在iphone不支持,即使以后支持Garbage collector,Apple 仍然建议使用手机管理内存,理由是更有效。这一点可能对于以前用Java,C#等具有自动内存管理的人可能不同意,毕竟手动管理内存是一个繁琐并且容易造成内存泄露。而硬件功能的越来越强大,完全可以弥补自动内存管理带来的效率问题。
2. Objective C严格意义上讲没有Constructor,但习惯上将以init开头的方法(消息)作为构造函数。dealloc 为析构函数。用于释放内存(常常用于释放类变量等)。
3. Objective C 的方法称为消息,这也是一个Objective C 一个显著特证,如果你看到一个代码中有类似
的代码,基本上可以判断这是一个Objective C代码。
同样的代码在Java 中
int age= person.getAge();
而在Objective C 中
NSInteger age=;
如果带参数,开始更不太习惯Objective C的语法:-)。
4. Objective C 中没有Namespace 的概念,为避免命名冲突,一般使用前缀,比如 NSString, NS为前缀。可以使用功能或是公司名缩写作为前缀。
5. 对于代码的注释,Objective C 一般还是使用Docxgen来生成代码的文档。
6. Cocoa 和 Cocoa Touch 中提供了Foundation Framework, AppKit, UIKit 接口等使用了Objective C 面向对象的对象接口,但相当一部分API依然是使用C接口,比如Quatz 二维图形库。又比如我打算在Objectivc C中找类似Java 库中 Math类,找了好一会儿没找到,Google 一下,居然还在math.h 和10年前用C 一样 :-)
最后借用Star trek voyager中一句台词“When in Colletive,adapt",如果要开发iphone应用或是Mac 应用,就要适应Objective C ,时间长了就习惯了。而且基本上凡是Java中有的面向对象的概念 ,Objective C也支持,只是以不同的方式来实现的。
Apple的文档和教程写得非常好,这也可以弥补一些开发环境上的不便之处。 你说的没错obj-c 是一个高度 依靠 run-time binding 的语言
即使类中没写 函数定义一样可以调用 不会编译出错只有1个warning
更牛的是 不需要获得原来类的源代码 不需要重新编译就可以给原有类添加功能
所有函数消息 都是动态榜定的
后果直接导致 运行效率 大大低于 c++
:lol
objective 和 c#java还是有很大区别的
和c++ 相对比较接近并且大量借用了smalltalk的机制:lol
[ 本帖最后由 rommi 于 25-10-2010 18:07 编辑 ] 原帖由 rommi 于 25-10-2010 18:01 发表 http://www.freeoz.cn/ibbs/images/common/back.gif
你说的没错obj-c 是一个高度 依靠 run-time binding 的语言
即使类中没写 函数定义一样可以调用 不会编译出错只有1个warning
更牛的是 不需要获得原来类的源代码 不需要重新编译就可以给原有类添加功能
所 ...
"更牛的是 不需要获得原来类的源代码 不需要重新编译就可以给原有类添加功能" 这个其它平台如 .Net 也可以。
我个人并不喜欢Objective C,所谓新出的版本XCode 4.0新的功能在其它平台Visual studio中早就有了,最不方便的是Objective C不支持Name Space,实在不方便,其它的还能忍受:lol :lol ,但就像回到使用Win32 SDK 的时代。
但苹果不会提供其它开发语言的,而在它的新的开发者协议中 ,居然强制只能使用C,C++,Objective C,颇有XX风格:lol :lol
3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited)
[ 本帖最后由 trisun 于 26-10-2010 13:04 编辑 ] 我刚换了台imac 配套的xcode只有3.2.7:(
有什么超大的改动 到 可以换大序号难道就是为了迎合iphone 4
mac下开发我遇到的最大麻烦就是内存消耗太大我们公司源代码量很大1kw行以上 一开始4g内存 每次ui debug起来 进到db code 必定内存耗尽死机只能从命令行起gdb后来加到8g好了点 只有极小模块会死现在加到12g 好了基本不死了:lol
在windows下 我也就4g内存visual studio从来不死:lol
话说回来不支持namespace 也没什么 一般有点年头的软件公司都会通过前缀来自动划分空间比如apple全用NS:lol 我最近也在研究iOS开发
买了一部macbook,还有一部ipod touch 4,加起来8000多人刀
macbook印象还不错,电力好,充满电用一个工作日没有问题,屏幕也很好,看着比较舒服。
但软件就不敢恭维了
我用惯了eclipse,目前觉得xcode简直是悲剧。。。
apple的文档比google也差得远了,比方说我想找所有界面控件的文档,Android有User Interface guide,说的比较清楚了,而参考文档只用看android.widget包下面就行了,但iOS开发文档里面竟然没有一个整合介绍所有界面元素的地方,每个文档都是分散的。
另外objective-c的语法也让人觉得有点人格分裂 "iOS开发文档里面竟然没有一个整合介绍所有界面元素的地方"
有这个文档。
---https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIKit_Framework/_index.html#//apple_ref/doc/uid/TP40006955
Apple 的文档还是不错的,特别是视频教程。 谢谢加分
国外情况我不是很清楚
中国目前状况是 mac工程师 需求量不是很大imac开发的基本没有 90%以上都是iphone
基本以小作坊为主简单来说都是创业型企业 最多也就10来个人 100人以上的公司我还没见过 还有很多完全是个人 基本依托 appstore
猎头也联系过我 我也面试过几家公司 offer都有 全是做iphone游戏的
我衡量了一下还是不打算去
原因主要是觉得不稳定 风险较大 原帖由 rommi 于 26-10-2010 18:18 发表 http://www.freeoz.biz/ibbs/images/common/back.gif
谢谢加分
国外情况我不是很清楚
中国目前状况是 mac工程师 需求量不是很大imac开发的基本没有 90%以上都是iphone
基本以小作坊为主简单来说都是创业型企业 最多也就10来个人 100人以上的公司我还没见过 还有 ...
是的,加入小作坊还不如自己干呢
我有个同事卖点flash转到iphone平台上的东西,每月也有几百刀收入呢 呵呵 是啊
虽然mac engineer需求量不大 但是我发现企业也很难招到满意的人
原因我觉得现在从事mac开发的人绝大部分都是转型而来的而且大部分人不太愿意冒风险放弃原来的东西
mac 开发大部分人还是愿意把它当作饭后甜点真正作为主菜的不多
:lol 用 Objective C正是要有耐心,一个简单的 字符相加都很麻烦:Q
NSString 都不支持 “+”
“A" + "B" + "C" +"D"
要写成
NSMutableString* result=;
:Q
回复 #17 trisun 的帖子
在来个 trimNSString *retStr=]; :lol
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语法不同,都给移植增加了工作量。在之后的文章会慢慢介绍。 原帖由 trisun 于 2-11-2010 01:03 发表 http://www.freeoz.org/ibbs/images/common/back.gif
用 Objective C正是要有耐心,一个简单的 字符相加都很麻烦:Q
NSString 都不支持 “+”
“A" + "B" + "C" +"D"
要写成
NSMutableString* re ...
哦,卖糕的,简约的iPhone OS/App就是用这么罗嗦的object-c开发的啊? 原帖由 ubuntuhk 于 3-11-2010 01:35 发表 http://www.freeoz.org/ibbs/images/common/back.gif
哦,卖糕的,简约的iPhone OS/App就是用这么罗嗦的object-c开发的啊?
objective-c 本质上还是C,不支持 operator overload 的,如果一直用C开发的话,用objective-c 还比较好,很多年没有用C了,重回到C ,还要重新慢慢适应:lol 写惯.net代码的人 回到C++/obj-c 确实痛苦啊
弄得不好就来一个EXE_BAD_ACCESS:lol 原帖由 trisun 于 3-11-2010 01:45 发表 http://www.freeoz.org/ibbs/images/common/back.gif
objective-c 本质上还是C,不支持 operator overload 的,如果一直用C开发的话,用objective-c 还比较好,很多年没有用C了,重回到C ,还要重新慢慢适应:lol
我主要用C,看来我应该比较容易适应objective-c:lol :lol LZ在熟悉 类库之前
最好应该先熟悉一下各种机制以及 interface builder的使用这样可以大大简化工作量 并且减少错误
例如 KVC KVO Binding Delegation Notification retain count autoreleasepool responder chain等等
还有xcode自带了很多performance tool 在debug的时候帮助很大
:lol
即使精通c++, apple官方的Memory Management Guide文档一定要读一下 否则肯定会经常遇到EXE_BAD_ACCESS毕竟内存管理方式还是有不同的:lol 想请教各位前辈一个问题
我能不能在类定义中加入一个 c 数组作为成员?
比方说
SomeClass.h
--------------------------
@interface SomeClass:NSObject
{
float matrix;
float *matrix2;
}
-(void)setMatrix: (float *)newMatrix;
@end
SomeClass.m
------------------------
@implementation SomeClass
-(id)init
{
matrix = 1;
matrix = 0;
...
matrix = 1;
//以下我估计是错的,因为函数执行结束的时候 f 分配的内存就没了
float f[] = {1, 0, 0, ...};
matrix2 = f;
}
//这样可能是正确的
-(void)setMatrix:(float *)newMatrix
{
matrix2 = newMatrix;
}
@end
我用惯了Java,从来没有考虑过内存管理的事,以前学的C早忘了
所以现在对objective-c有点困惑
[ 本帖最后由 mianwo 于 15-11-2010 12:44 编辑 ] obj-c内存管理和 c/c++还有一定区别
栈上控制是一样的
//以下我估计是错的,因为函数执行结束的时候 f 分配的内存就没了
理解正确
堆上不一样
c++ delete以后内存立刻被清掉
obj-c是完全使用 引用记数release使retain count减1 减到0才会调用dealloc(destructor)并清掉内存
一般使用property 和synthesize来写get/set函数
同时配有3个属性retain assign copy
retain: 引用记数+1
assign:引用记数不变
copy: 复制一块一样的内存 同样使这块内存的引用记数变成1
//这样可能是正确的
-(void)setMatrixfloat *)newMatrix
{
matrix2 = newMatrix;
}
这里 你想一想是否变成了2个指针指向同一块内存? 如果newMatrix对应的实参调用release 是否你的matrix2 变成了野指针? 而且外面调用者 不会考虑你是怎么做的 他只会管好他写的代码 所以他alloc出来的东西肯定会调用release
正确写法应该是
-(void)setMatrixfloat *)newMatrix
{
; // 1. 这里你retain住使retain count变成2, 外面release一次变成1, 这时你想要得这块内存并没有被释放
; // 2. 这里要清掉你之前指向的内存 因为matrix2之前可能指向别的内存 等于线断了 retain count要减1
matrix2 = newMatrix;// 3. matrix指向你要得内存 因为你已经retain住了所以不会被释放但是最后一次release要放在dealloc里面 使你指向的这块内存被释放
}
[ 本帖最后由 rommi 于 15-11-2010 13:45 编辑 ] 顺便建议不要使用c语言数组 (我从来不用)
1. 使用cocoa容器 NSArray NSMutableArray 等等
注意往容器里面addObject的时候retain count是会自动+1的 removeObject的时候会自动减1
所以有些东西不能放进cocoa容器 比如你想要一个delegate数组 如果使用NSMutableArray会导致循环引用 结果就是谁都释放不掉
2. 像1中不能放入的建议放入stl容器因为stl容器不会+1 -1 原帖由 rommi 于 15-11-2010 13:40 发表 http://www.freeoz.org/ibbs/images/common/back.gif
-(void)setMatrixfloat *)newMatrix
{
; // 1. 这里你retain住使retain count变成2, 外面release一次变成1, 这时你想要得这块内存并没有被释放
; // 2. 这里要清掉你之前指向的内存 因为matrix2之前可能指向别的内存 等于线断了 retain count要减1
matrix2 = newMatrix;// 3. matrix指向你要得内存 因为你已经retain住了所以不会被释放但是最后一次release要放在dealloc里面 使你指向的这块内存被释放
}.
C 指针能用 retain ,release 吗? 我因为只有NSObject 才可以用。
我还是用 malloc ,free.
[ 本帖最后由 EnsignKim 于 15-11-2010 13:54 编辑 ] 我用c数组是用来跟open gl打交道,变换矩阵和顶点模型什么的,这样比较方便。可以直接传给opengl函数 上来抱怨一下,iOS SDK竟然连求逆矩阵的方法都没有
害得我要把公式翻出来,自己写逆矩阵函数。。。
页:
[1]
2