iOS开发60分钟入门
本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发iOS App,学习目标包括:
∙能使用Xcode IDE、模拟器
shelly佳
∙能修改、调试已有iOS App
∙能在已有应用内创建新模块
∙能创建新应用
∙能发布应用到App Store
本文不包含任何高级的iOS开发知识,已学会iOS开发的同学不要看,看完这篇文章学会了的同学也不用再看了。
不仅是学习一门新语言
有过脚本开发经验的人(如Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的
学习曲线比脚本语言要高,是的,这种感觉是对的。因为学iOS开发,不仅是学习一门新语言,它包括:
∙一门语言:Objective-C
∙一个框架:Cocoa Touch
∙一个IDE:Xcode
初学脚本语言通常不会来绘制图形界面、与人交互,iOS如果不做图形界面,像脚本语言一样处理文本操作数据库,就没啥意思了。
所以,过去我写别的新手入门教程,通常都是写《XXX入门15分钟教程》,而iOS就要花数倍的时间来写了。
环境准备
做iOS开发一定要有苹果的软件环境:Mac OS操作系统、Objective-C编译器、设备模拟器等,开发工具倒不一定要用Xcode,只要是个源代码编辑工具就行(vim都行,只是没Xcode那么多功能)。
Mac OS
拥有Mac OS环境最简单的方法是一台苹果电脑,包括iMac, MacBook Pro, MacBook Air, Mac Mini,但不包括苹果的移动设备(iPod Touch, iPhone, iPad, iPad Mini,它们运行的是iOS系统,不是Mac OS),苹果电脑在出厂
的时候就会预装Mac OS,目前最新版本是Mac OS X 10.8,主流的版本还有Mac OS X 10.6、Max OS X 10.7。
如果囊中羞涩,可以借一台,或者上淘宝买个二手的。
黑苹果
提到iOS开发入门,似乎没办法不说黑苹果。所谓黑苹果,就是把Mac OS改造后安装在非苹果的硬件上,这是违反DMCA法案的,黑苹果的更多资料,可以在维基上到
苹果电脑价格高,国内软件开发者生存压力大,所以黑苹果在国内也有一些真实的存在,国外当然也有啦。
黑苹果基本可以胜任iOS开发,但有一些问题:
∙安装黑苹果是非法的
∙个人行为苹果公司一般不会追究,但会遭同行的鄙视
∙黑苹果超级难装,挑硬件。即使完全相同的型号,相同的批次,也有可能A机器装上了,B机器装不上
∙黑苹果系统多少都存在一些使用上的问题,像驱动Bug啦、待机恢复蓝屏啦、上网浏览有问题啦
∙黑苹果不能随意升级,可能升级一次safari就导致整个系统崩溃了
上面这些虽然不会直接影响Xcode写代码、模拟器测试,但写着写着想上网查个东西的时候,safari不能翻页,确实挺影响心情的。所以,钱包允许的前提下,还是搞个苹果电脑省心一些。
宋 祖儿Xcode 和模拟器
Xcode可以在苹果免费下载:Xcode下载地址
安装Xcode时会自动安装iOS SDK和模拟器。
这么强大的IDE居然是免费的,还是挺让人开心的。
从改一个现成的应用开始吧
学一门新软件开发技能,能够第一时间做出一个可运行的产品非常重要,有助于给自己正面激励,我上大学的时候,有很多次想学一门新语言,往往花了半个月,还沉浸在数据类型和语法字典里,连第一个Hello World都没做出来。
这一次,就让我们从改一个现成的应用开始吧。
下载
首先,我们从苹果开发者中心下载一个示例代码回来。我选了ToolBarSearch。
在本文档的末尾,还有一些其它的网址可以下载开源iOS产品或者代码段,但我试了一下,还是Apple Sample Code最容易成功。
下载回来的zip文件最好保存在"下载"或者"文稿"目录里,因为在Mac OS 10.8以前,有些目录(例如/var/private/tmp)在Finder中是看不到的,要通过Finder的“前往> 前往文件夹”功能才能进入。
有三种方式可以打开一个iOS Project
双击project文件
打开Finder,进入刚刚下载解压的ToolBarSearch目录,到ToolBarSearch.Xcodeproj文件,双击之,Xcode会自动启动,并打开这个项目
在Xcode里选择Project打开
∙在Xcode没启动的情况下(如果Xcode已经启动了,就先按Command Q退出),启动Xcode,会弹出“Welcome to Xcode”的欢迎页,点击左
下角的“Open Other”按钮,到ToolBarSearch目录,双击
ToolBarSearch目录,或者双击ToolBarSearch.Xcodeproj文件都可以∙如果Xcode处于打开状态,可以点击其菜单栏的File -> Open,或者File -> Open Recent,然后再选择要打开的项目
通过命令行打开
在Mac OS 10.8以前,有些目录(例如/var/private/tmp),在Finder和Xcode的File > Open对话框中,点击鼠标是不到的,这时候就要通过命令行终端来打开了。
夏天的妈妈是谁打开终端,执行:
巫女雅江
cd /ToolBarSearch的父目录/ToolBarSearch
东部战区在哪
open -a Xcode
open -a是mac os的系统命令,除了iOS项目,别的项目也可以这样打开。
运行刚下载的应用
点击Xcode左上角的Run按钮(或者同时按下Comman和R键),Xcode会编译源码并在模拟器中运行这个应用。
ipad下载的文件在哪里
编译成功会在屏幕上淡淡地显示“Build Succeeded”。反之,失败就显示“Build Failed”且不启动模拟器。
修改
在模拟器上看到“Performed search using…”了吧,下面我们改掉它。
∙在Xcode左上角的Run按钮下方,有一排小按钮,从左到右第三个是一个放大镜图标,鼠标移上去会显示“Show the Search Navigator”,点
一下它,打开搜索界面,在它下方出现的Find输入框中输入
“performed”
∙搜索结果只有一条:ToolbarSearchViewController.m,点文件名下方被高亮的“Performed”字串,右侧代码编辑区会自动打开这个文件,并滚动屏幕,使包含“Performed”的这一行出现在编辑区的中间。
∙修改双引号里的字串,随便改成啥,然后按“Command S”保存。
当然,这些操作,你也可以在终端下通过grep和vim完成。
运行修改后的应用
按Command R运行,看看,是不是看到效果啦?
是的,修改一个应用就这么简单。
Objective-C
Objective-C是苹果应用软件(包括苹果电脑上的Mac OS App和移动设备上的iOS App)的开发语言。它是一种面向对象的编程语言。
苹果公司还提供了一个软件,叫Interface Builder,简称IB,用于可视化的界面制作,就像用Dreamwe
aver做网页,或者像Visual Basic做桌面软件一样。后来IB就整合进了Xcode,成了Xcode的一部分。这篇文档不讲IB,只讲Objective-C,因为:
∙基本上,每一本讲iOS开发的书(纸质书、电子书),都有大量的截图一步一步教如何用IB开发iOS应用,而讲Objective-C开发应用的书却没有那么多。
∙IB可以用来直观方便地画界面、设置控件属性、建立代码与控件的联系,但后台的业务逻辑和数据处理仍然要靠Objective-C,可见,不管用不用IB,Objective-C都是绕不过去的。
C的超集
Objective-C扩展了ANSI C,是C的超集,也就是说:
∙任何C源程序,不经修改,即可通过Objective-C编译器成功编译
∙Objective-C源程序中可以直接使用任何C语言代码
除了面向对象有语法是SmallTalk风格的(下面会讲到),其它非面向对象的语法、数据类型,与C完全相同,所以本文就不再赘述。来看一个经典的Hello World示例吧:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]){
@autoreleasepool{
NSLog(@"Hello World!");
}
return 0;
}
是不是仿佛穿越回了大一学习C语言的时代,看起来和C几乎没有区别,是吧?是的,因为还没用到它的面向对象特性,哈哈!
SmallTalk的消息传递语法风格
Objective-C的面向对象语法源自SmallTalk,消息传递(Message Passing)风格。在源码风格方面,这是它与C Family语言(包括C/C++、Java、PHP)差别最大的地方。
在Java、C++世界,我们调用一个对象的某方法,在Objective-C里,这称作给类型发送一个消息,这
可不仅仅是文字游戏,他们的技术细节也是不同的。
在Java里,对象和方法关系非常严格,一个方法必须属于一个类/对象,否则编译是要报错的。而在Objective-C里,类型和消息的关系比较松散,消息处理到运行时(runtime)才会动态决定,给类型发送一个它无法处理的消息,也只会抛出一个异常,而不会挂掉。
[obj undefinedMethod];
在代码里调用没定义的方法(这是Java世界的习惯说法啊,专业的叫法是,给obj对象传递它无法处理的消息),Xcode会警告,但编译能成功,运行的时候会出错。它会输出这样一个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'
类似Java的OOP概念
Objective-C中一些面向对象的概念,也可以在Java中到类似的实现(只能说是类似,不是完全相同),我的读者基本都是Java和PHP程序员,我会在下文中尽量用Java的概念来类比。