找回密码
 FreeOZ用户注册
查看: 12355|回复: 58

[论坛技术] iphone 开发学习笔记

[复制链接]
发表于 20-10-2010 13:41:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
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 编辑 ]

评分

参与人数 5威望 +250 收起 理由
maodoubao + 50 谢谢分享!
MillerYang + 50 谢谢分享!
ubuntuhk + 50 谢谢分享!
coredump + 50 你太有才了!
清风不写字 + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

发表于 20-10-2010 15:20:30 | 显示全部楼层
建议看一本书  评价较好的
cocoa programming for mac osx
作者:Aaron Hillegass

评分

参与人数 1威望 +50 收起 理由
trisun + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

 楼主| 发表于 20-10-2010 15:36:26 | 显示全部楼层


我一般先看一下入门级的书,用于了解一下新的平台。入门级的书一般很便宜,后面一般就不看纸质的书,直接看在线文档了
回复  

使用道具 举报

发表于 20-10-2010 18:37:14 | 显示全部楼层
我在公司做过一些PC往mac方向的移植
不过没有接触过iphone开发
不过 我们不用工具 纯手工移植 c++ mfc代码还好
.net就苦了 先先用native c++重新实现managed code  然后在移到mac上
相当痛苦
回复  

使用道具 举报

发表于 20-10-2010 23:52:02 | 显示全部楼层

回复 #1 trisun 的帖子

我也想捣鼓iPhone/iPad的应用开发,其中成本投入最大的就是iMac/Macbook,经济紧张的同学可以试试PC上装MacOS:
http://bbs.weiphone.com/read-htm-tid-517742.html

我试了一下,可以在X200上装起来,不过显卡和无线网卡的驱动比较麻烦,声卡的驱动应该比较简单,但是作为app开发机,也勉强能用。

当然体验完之后,还是得攒钱买mac
回复  

使用道具 举报

发表于 21-10-2010 11:23:05 | 显示全部楼层
mac 应该还可以吧
毕竟配套送了很多软件
你想想单买一个visual studio就多少钱了
当然咯 这些不适合中国国情
回复  

使用道具 举报

发表于 23-10-2010 14:09:37 | 显示全部楼层
呵呵,这两天刚刚在windows7上用虚拟机装了个Mac OS X, 速度还真不错, 正准备捣鼓捣鼓iphone开发呢
回复  

使用道具 举报

 楼主| 发表于 24-10-2010 15:15:54 | 显示全部楼层

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 一个显著特证,如果你看到一个代码中有类似
   [object message] 的代码,基本上可以判断这是一个Objective C代码。
   同样的代码在Java 中
       int age= person.getAge();
   而在Objective C 中
       NSInteger age=[person getAge];
   如果带参数,开始更不太习惯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的文档和教程写得非常好,这也可以弥补一些开发环境上的不便之处。
回复  

使用道具 举报

发表于 25-10-2010 17:01:28 | 显示全部楼层
你说的没错  obj-c 是一个高度 依靠 run-time binding 的语言
即使类中没写 函数定义  一样可以调用 不会编译出错  只有1个warning
更牛的是 不需要获得原来类的源代码 不需要重新编译  就可以给原有类添加功能
所有函数消息 都是动态榜定的
后果直接导致 运行效率 大大低于 c++


objective 和 c#  java还是有很大区别的
和c++ 相对比较接近  并且大量借用了smalltalk的机制

[ 本帖最后由 rommi 于 25-10-2010 18:07 编辑 ]
回复  

使用道具 举报

 楼主| 发表于 26-10-2010 11:51:27 | 显示全部楼层
原帖由 rommi 于 25-10-2010 18:01 发表
你说的没错  obj-c 是一个高度 依靠 run-time binding 的语言
即使类中没写 函数定义  一样可以调用 不会编译出错  只有1个warning
更牛的是 不需要获得原来类的源代码 不需要重新编译  就可以给原有类添加功能
所 ...


"更牛的是 不需要获得原来类的源代码 不需要重新编译  就可以给原有类添加功能" 这个其它平台如 .Net 也可以。
我个人并不喜欢Objective C,所谓新出的版本XCode 4.0新的功能在其它平台Visual studio中早就有了,最不方便的是Objective C不支持Name Space,实在不方便,其它的还能忍受 ,但就像回到使用Win32 SDK 的时代。
但苹果不会提供其它开发语言的,而在它的新的开发者协议中 ,居然强制只能使用C,C++,Objective C,颇有XX风格

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 编辑 ]
回复  

使用道具 举报

发表于 26-10-2010 12:16:37 | 显示全部楼层
我刚换了台imac 配套的xcode只有3.2.7
有什么超大的改动 到 可以换大序号  难道就是为了迎合iphone 4

mac下开发我遇到的最大麻烦就是内存消耗太大  我们公司源代码量很大  1kw行以上 一开始4g内存 每次ui debug起来 进到db code 必定内存耗尽死机  只能从命令行起gdb  后来加到8g好了点 只有极小模块会死  现在加到12g 好了  基本不死了

在windows下 我也就4g内存  visual studio从来不死

话说回来  不支持namespace 也没什么   一般有点年头的软件公司  都会通过前缀来自动划分空间  比如apple全用NS

评分

参与人数 1威望 +50 收起 理由
trisun + 50 谢谢分享!多写些Mac开发经验吧。

查看全部评分

回复  

使用道具 举报

发表于 26-10-2010 15:58:12 | 显示全部楼层
我最近也在研究iOS开发
买了一部macbook,还有一部ipod touch 4,加起来8000多人刀

macbook印象还不错,电力好,充满电用一个工作日没有问题,屏幕也很好,看着比较舒服。

但软件就不敢恭维了
我用惯了eclipse,目前觉得xcode简直是悲剧。。。
apple的文档比google也差得远了,比方说我想找所有界面控件的文档,Android有User Interface guide,说的比较清楚了,而参考文档只用看android.widget包下面就行了,但iOS开发文档里面竟然没有一个整合介绍所有界面元素的地方,每个文档都是分散的。
另外objective-c的语法也让人觉得有点人格分裂

评分

参与人数 1威望 +10 收起 理由
EnsignKim + 10 谢谢分享!

查看全部评分

回复  

使用道具 举报

 楼主| 发表于 26-10-2010 17:11:26 | 显示全部楼层
"iOS开发文档里面竟然没有一个整合介绍所有界面元素的地方"
有这个文档。
---https://developer.apple.com/libr ... /doc/uid/TP40006955


Apple 的文档还是不错的,特别是视频教程。
回复  

使用道具 举报

发表于 26-10-2010 17:18:49 | 显示全部楼层
谢谢加分

国外情况我不是很清楚
中国目前状况是 mac工程师 需求量不是很大  imac开发的基本没有 90%以上都是iphone
基本以小作坊为主  简单来说都是创业型企业 最多也就10来个人 100人以上的公司我还没见过 还有很多完全是个人 基本依托 appstore

猎头也联系过我 我也面试过几家公司 offer都有 全是做iphone游戏的
我衡量了一下  还是不打算去
原因主要是觉得不稳定 风险较大
回复  

使用道具 举报

发表于 26-10-2010 17:33:07 | 显示全部楼层
原帖由 rommi 于 26-10-2010 18:18 发表
谢谢加分

国外情况我不是很清楚
中国目前状况是 mac工程师 需求量不是很大  imac开发的基本没有 90%以上都是iphone
基本以小作坊为主  简单来说都是创业型企业 最多也就10来个人 100人以上的公司我还没见过 还有 ...


是的,加入小作坊还不如自己干呢
我有个同事卖点flash转到iphone平台上的东西,每月也有几百刀收入呢
回复  

使用道具 举报

发表于 26-10-2010 18:27:40 | 显示全部楼层
呵呵 是啊
虽然mac engineer需求量不大 但是我发现企业也很难招到满意的人  
原因我觉得  现在从事mac开发的人绝大部分都是转型而来的  而且大部分人不太愿意冒风险放弃原来的东西
mac 开发大部分人还是愿意把它当作饭后甜点  真正作为主菜的不多
回复  

使用道具 举报

 楼主| 发表于 2-11-2010 00:03:52 | 显示全部楼层
用 Objective C正是要有耐心  ,一个简单的 字符相加都很麻烦
NSString 都不支持 “+”

“A" + "B" + "C" +"D"
要写成 [NSString stringWithFormat"%@%@%@%@",@"A",@"B",@"C",@"D"]
NSMutableString* result=[NSMutableString new];
[result stringByAppendingString"A" ......]


回复  

使用道具 举报

 楼主| 发表于 2-11-2010 00:07:25 | 显示全部楼层

回复 #17 trisun 的帖子

在来个 trim


NSString *retStr=[result2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];   
回复  

使用道具 举报

 楼主| 发表于 3-11-2010 00:31:54 | 显示全部楼层

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语法不同,都给移植增加了工作量。在之后的文章会慢慢介绍。
packages.PNG

评分

参与人数 1威望 +50 收起 理由
ubuntuhk + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

发表于 3-11-2010 00:35:26 | 显示全部楼层
原帖由 trisun 于 2-11-2010 01:03 发表
用 Objective C正是要有耐心  ,一个简单的 字符相加都很麻烦
NSString 都不支持 “+”

“A" + "B" + "C" +"D"
要写成 [NSString stringWithFormat"%@%@%@%@",@"A",@"B",@"C",@"D"]
NSMutableString* re ...


哦,卖糕的,简约的iPhone OS/App就是用这么罗嗦的object-c开发的啊?
回复  

使用道具 举报

 楼主| 发表于 3-11-2010 00:45:54 | 显示全部楼层
原帖由 ubuntuhk 于 3-11-2010 01:35 发表


哦,卖糕的,简约的iPhone OS/App就是用这么罗嗦的object-c开发的啊?


objective-c 本质上还是C,不支持 operator overload 的,如果一直用C开发的话,用objective-c 还比较好,很多年没有用C了,重回到C ,还要重新慢慢适应
回复  

使用道具 举报

发表于 3-11-2010 19:09:45 | 显示全部楼层
写惯.net代码的人 回到C++/obj-c 确实痛苦啊
弄得不好就来一个EXE_BAD_ACCESS
回复  

使用道具 举报

发表于 3-11-2010 19:50:25 | 显示全部楼层
原帖由 trisun 于 3-11-2010 01:45 发表


objective-c 本质上还是C,不支持 operator overload 的,如果一直用C开发的话,用objective-c 还比较好,很多年没有用C了,重回到C ,还要重新慢慢适应


我主要用C,看来我应该比较容易适应objective-c
回复  

使用道具 举报

发表于 4-11-2010 11:31:42 | 显示全部楼层
LZ在熟悉 类库之前
最好应该先熟悉一下各种机制  以及 interface builder的使用  这样可以大大简化工作量 并且减少错误
例如 KVC KVO Binding Delegation Notification retain count autoreleasepool responder chain等等
还有xcode自带了很多performance tool 在debug的时候帮助很大

即使精通c++, apple官方的Memory Management Guide文档一定要读一下 否则肯定会经常遇到EXE_BAD_ACCESS  毕竟内存管理方式还是有不同的

评分

参与人数 1威望 +50 收起 理由
trisun + 50 谢谢分享!该看的文档都看过了。

查看全部评分

回复  

使用道具 举报

发表于 15-11-2010 11:39:33 | 显示全部楼层
想请教各位前辈一个问题

我能不能在类定义中加入一个 c 数组作为成员?

比方说
SomeClass.h
--------------------------
@interface SomeClass:NSObject
{
  float matrix[16];
  float *matrix2;
}
-(void)setMatrix: (float *)newMatrix;
@end


SomeClass.m
------------------------

@implementation SomeClass
-(id)init
{
matrix[0] = 1;
matrix[1] = 0;
...
matrix[15] = 1;

//以下我估计是错的,因为函数执行结束的时候 f 分配的内存就没了
float f[] = {1, 0, 0, ...};
matrix2 = f;
}

//这样可能是正确的
-(void)setMatrixfloat *)newMatrix
{
matrix2 = newMatrix;
}
@end


我用惯了Java,从来没有考虑过内存管理的事,以前学的C早忘了
所以现在对objective-c有点困惑

[ 本帖最后由 mianwo 于 15-11-2010 12:44 编辑 ]
回复  

使用道具 举报

发表于 15-11-2010 12:40:55 | 显示全部楼层
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
{
[newMatrix retain];   // 1. 这里你retain住使retain count变成2, 外面release一次变成1, 这时你想要得这块内存并没有被释放
[matrix2 release];    // 2. 这里要清掉你之前指向的内存 因为matrix2之前可能指向别的内存 等于线断了 retain count要减1
matrix2 = newMatrix;  // 3. matrix指向你要得内存 因为你已经retain住了所以不会被释放  但是最后一次release要放在dealloc里面 使你指向的这块内存被释放
}

[ 本帖最后由 rommi 于 15-11-2010 13:45 编辑 ]
回复  

使用道具 举报

发表于 15-11-2010 12:52:06 | 显示全部楼层
顺便建议不要使用c语言数组 (我从来不用)

1. 使用cocoa容器 NSArray NSMutableArray 等等
   注意往容器里面addObject的时候retain count是会自动+1的 removeObject的时候会自动减1
      所以有些东西不能放进cocoa容器 比如你想要一个delegate数组 如果使用NSMutableArray会导致循环引用 结果就是谁都释放不掉

2. 像1中不能放入的建议放入stl容器  因为stl容器不会+1 -1
回复  

使用道具 举报

发表于 15-11-2010 12:53:27 | 显示全部楼层
原帖由 rommi 于 15-11-2010 13:40 发表
-(void)setMatrixfloat *)newMatrix
{
[newMatrix retain];   // 1. 这里你retain住使retain count变成2, 外面release一次变成1, 这时你想要得这块内存并没有被释放
[matrix2 release];    // 2. 这里要清掉你之前指向的内存 因为matrix2之前可能指向别的内存 等于线断了 retain count要减1
matrix2 = newMatrix;  // 3. matrix指向你要得内存 因为你已经retain住了所以不会被释放  但是最后一次release要放在dealloc里面 使你指向的这块内存被释放
}.


C 指针能用 retain ,release 吗? 我因为只有NSObject 才可以用。
我还是用 malloc ,free.

[ 本帖最后由 EnsignKim 于 15-11-2010 13:54 编辑 ]
回复  

使用道具 举报

发表于 15-11-2010 16:08:43 | 显示全部楼层
我用c数组是用来跟open gl打交道,变换矩阵和顶点模型什么的,这样比较方便。可以直接传给opengl函数
回复  

使用道具 举报

发表于 15-11-2010 22:39:26 | 显示全部楼层
上来抱怨一下,iOS SDK竟然连求逆矩阵的方法都没有
害得我要把公式翻出来,自己写逆矩阵函数。。。

评分

参与人数 1威望 +50 收起 理由
trisun + 50 谢谢分享!iOS SDK 很弱

查看全部评分

回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 18-4-2024 15:18 , Processed in 0.044043 second(s), 48 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表