文档章节

【原创】iOS开发入门教程

Mr.Zheng
 Mr.Zheng
发布于 2013/05/24 21:28
字数 4059
阅读 28612
收藏 378
点赞 6
评论 32

程序发轻狂,代码阑珊,苹果开发安卓狂!——写给狂热的编程爱好者们

本文概览

###写在前面的话

学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程。索性就从最基础的开始,一步一步记录一个最简单的iOS应用从创建到运行的全过程,其中会穿插很多相关知识或是遇到过的问题。其实算不上教程,但希望能够帮助更多的开发爱好者更快、更好的入门。

###iOS开发环境简述

最友好,最现实,也是最方便的开发环境就是在Mac系统中安装Xcode进行开发。原因在于:第一,开发工具(Xcode)限制。苹果官方只提供Mac版的Xcode,而Xcode内置了Xcode IDE,性能分析工具,iOS SDK,iOS模拟器和最新的OS X,可以方便迅速的进行代码编辑以及应用调试,可谓是Mac和iOS开发工具的不二选择。第二,代码提示和自动补全。iOS开发中用到的类或方法的名称,为了更具语义化,让开发者一目了然,通常会比较长,这往往会让刚刚接触iOS开发的开发者为了记住这些方法而伤透脑经。而Xcode拥有优于其他编辑器的OC代码提示和自动补全功能,这将很大程度降低开发入门的门槛,这决定你开发iOS应用没有理由不使用Xcode。因此,使用非苹果电脑的开发者们最好安装Mac OS X的虚拟机,进行开发学习,否则你不仅会比别人花上多出一倍甚至更多的时间去搭建开发环境,而且代码编写上也会比使用Xcode开发的人花上更多的精力。

###第一步,创建项目

####1.1 新建iOS项目

打开Xcode,如果是首次打开Xcode,你将会看到一个欢迎界面,如图:

Welcome to Xcode

你可以直接在该界面中点击图中1处标记的Create a new Xcode project来创建一个项目,也可以点击图中2处标记的按钮来打开电脑中已经存在的Xcode项目。你还可以修改3处标记的复选框状态设置下次启动Xcode是否显示该欢迎界面。

本文不演示在此点击1处所示创建项目,首先点击该界面左上角的红色按钮退出该欢迎界面,然后点击屏幕左上角的File->New->Project。截图如下:

新建项目

接下来你将看到如下界面:

选择应用模板

首先进行系统筛选,iOS应用则选择iOS列表对应项,OS X应用则选择OS X列表对应项。本例为iOS应用,故在此选择iOS中的Application(图中左上角红框所示),然后选择应用模板选择,在界面右边列出了多种最常用的应用模板类型,开发者按照自己的应用需求可自行选择,本例选择Single View Application(图中右上角红框所示)。做完以上选择后点击窗口右下角Next按钮,进入下一个设置窗口:

应用基础信息设置

此处内容会根据个人情况而不同,故不做赘述,按照窗口提示,填写相关信息即可。注意窗口下方的三个复选框,其功能分别是使用storyboards使用自动引用计数器包含单元测试,根据个人情况勾选/取消即可。设置完成后点击右下角Next按钮,进入下一个窗口:

选择保存位置

按照窗口所示,选择项目存储位置后点击窗口右下角Create按钮,完成应用创建过程。

####1.2 应用程序目录结构说明

项目创建完成之后,Xcode会进入项目开发界面,界面大致分为三部分,左侧项目及目录结构列表、中间为代码编辑区、右侧属性设置和控件列表等区域。下面是目录结构的截图:

项目目录结构

项目初始时包含如图所示三个主要目录,后续开发中开发者可以自行添加目录。其中:

  • FirstIosApp目录与项目名称同名,主要存放应用相关源代码和配置文件;
  • Framework存放项目使用到的框架,默认会添加图示三个必备框架;
  • Products用于存放生成的应用文件,开发中开发者一般不必关心。

####1.3 应用程序初始结构概览

整个应用程序的入口文件默认为AppDelegate.m,应该可以通过配置文件修改(未尝试)。其内部结构如下:

应用程序入口结构

该文件包含应用程序生命周期中各个阶段可以调用的方法接口,以便应用程序在不同的状态阶段能进行相应的操作。这些方法就不一一说明了,开发者几乎可以望名知意。

#####1.3.1 iOS应用程序的生命周期

对于上面图示方法如果还有不解的地方,可以参考下图(来源于网络):

iOS生命周期

###第二步 代码入门(数据类型)

做iOS开发,仅仅懂得使用Xcode,仅仅了解目录结构,仅仅了解生命周期,是远远不够的,这些只是基础中的基础。一定的编程能力也是必不可少的。下面就简单的介绍一下iOS开发的编程语言——Objective-C,后面简称OC。

学习一门语言,往往需要从最基础的数据类型开始(记得大学学习的时候老师就是这么干的),至于编程逻辑,奇技淫巧等则是在开发过程中慢慢积累的。好言归正传。

####2.1 基础数据类型

OC是C语言的一个超类,因此OC拥有C或C++的几乎所有特性,当然它也有自己独具一格的地方。所以OC也支持C语言的数据类型,诸如int,float等也都可以在OC中使用。基础数据类型不是本文重点,在此就不多言辞了。

####2.2 OC数据类型

OC不是仅仅只能使用C/C++的数据类型,它也拥有自己的数据类型,虽然与通常人们熟知的各种数据类型看起来有点怪异,但事实上OC的数据类型是个很好玩的东西,也不难理解。下面列举几个常见的OC数据类型。

#####2.1.1 NSNumber类和NSInterger

NSNumber是以对象的形式来包装基础数据类型,它提供以下方法:

<!-- lang: cpp -->
+ (NSNumber *) numberWithChar: (char) value;
+ (NSNumber *) numberWithInt: (int) value;
+ (NSNumber *) numberWithFloat: (float) value;
+ (NSNumber *) numberWithBool: (BOOL) value;

例如,要从一个int数据初始化一个NSNumber可以这样写:

<!-- lang: cpp -->
NSNumber *number = [NSNumber numberWithInt: 100];

而要从NSNumber实例得到NSInteger数据则可以如下操作:

<!-- lang: cpp -->
NSInteger integer = [number intValue];

#####2.1.2 NSString类型

NSString是OC的字符串类。与普通字符串不同的是NSString的值需要在普通字符串前加上一个@符号。例如要初始化一个'I'm a string.'的OC字符串,我们需要这样做:

<!-- lang: cpp -->
NSString *str = [NSString stringWithString: @"I'm a string."];

看起来很麻烦,很复杂的样子,不要担心,OC应该也考虑到了这一点,所以它也提供简写形式:

<!-- lang: cpp -->
NSString *str = @"I'm a string.";

NSString类还提供了很多其他形式的创建字符串的方法(比如:stringWithFormat等),这里就不一一列举了,以后在开发中慢慢体会吧。

####2.1.3 NSArray类型

NSArray是OC的数组类。OC的数组是很强大的,在一个数组中可以允许存在不同类型的数据,这个特性就跟强大的JavaScrit一样。初始化一个数组可以这样操作:

<!-- lang: cpp -->
NSArray *arr = [NSArray arrayWithObjects:@"a", @"b", @1, nil];

当然也支持简化形式:

<!-- lang: cpp -->
NSArray *arr = @[@"a", @"b", @1];

需要说明一点,使用arrayWithObjects方法创建数组的时候最后需要以nil结尾,而使用简化方式的时候不需要。

开发中可以使用以下两种形式获取数组对应索引位置(index)的值:

<!-- lang: cpp -->
NSString *a = arr[index];
NSString *b = [arr objectAtIndex: index];

####2.1.4 NSDictionary类型

NSDictionary是OC的字典类。字典类型在使用中以key-value键值对的形式存在。也支持多种初始化方式,下面列举两种:

<!-- lang: cpp -->
NSDictionary *dic = [NSDictionary dictionaryWithObjects:@[@"a",@"b", @"c"] forKeys:@[@"first", @"second", @"third"]];
//或者使用下面的形式
NSDictionary *dic = @{@"first": @"a", @"second": @"b", @"third": @"c"};

取值方法跟NSArray大同小异:

<!-- lang: cpp -->
NSString *a = [dic objectForKey: @"first"];
NSString *b = dic[@"second"];

####2.1.5 NSDate类型

NSDate是OC的日期类。常见用法举例:

<!-- lang: cpp -->
NSDate *date = [NSDate date]; //返回当前时间
NSDate *date = [[NSDate alloc] init]; //初始化为当前时间,类似date

###第三步 OC类的认识(成员变量和方法)

iOS开发常常伴随着视图,而视图往往离不开视图控制器,在iOS开发中每一个视图控制器就是一个OC的类,因此学习iOS开发就必须了解OC的类。

OC的类使用@interface ClassName: superClass <protocol> … @end结构来定义,NSObject是所有OC类的父类。与java相比OC的@interface关键字就等同于JAVA的class关键字,OC的protocol就是JAVA中的interface,这一点很据迷惑力,大家在学习时需要特别注意。

####3.1 类的声明

举例声明一个Person的类(视图控制器)并实现它,拥有nameage两个成员变量,自然需要定义getNamesetNamegetAgesetAge,下面我们看下这个过程。

首先,类的结构如下:

<!-- lang: cpp -->
@interface Person: NSObject {
    NSString *name;
    int age;
}

@end

然后,我们声明它的setter和getter方法,用来设置和读取它的成员变量的值。按照传统方式应该如下定义:

<!-- lang: cpp -->
@interface Person: NSObject {
    NSString *name;
    int age;
}

- (void) setName: (NSString *) newName;
- (NSString *) getName;

- (void) setAge: (int) newAge;
- (int) getAge;

@end

看,是不是很简单?然而,既然上面说了是传统方式,那么肯定OC还提供了更现代的方式:

<!-- lang: cpp -->
@interface Person: NSObject {
    NSString *name;
    int age;
}

@property(nonatomic, strong) NSString *name;
@property(nonatomic, assign) int age;

@end

没错,你没看错,就这么简单,它的功能和上面的代码是一样的。补充一下,@property本身可以接受参数来指定变量的getter和setter方式,其参数可用值和具体功能如下:

<!-- lang: cpp -->
nonatomic //声明变量只在单线程中工作
atomic //默认值,可能有多个线程会用到这个变量

copy //分配一个新的空间,把原地址的内容复制过来
assign //简单的传递指针
retain //传递指针后引用计数器(retainCount)会自加1

strong //强引用
weak //弱引用

声明就这样就完成了,下面我们看下它的具体实现,在OC中类的实现需要使用另外一个关键字@implementation,格式如下:

<!-- lang: cpp -->
@implementation Person

@end

我们还是先看下传统方式声明getter和setter方法该如何实现:

<!-- lang: cpp -->
@implementation Person

- (void) setName: (NSString *) newName {
    self.name = newName;
}

- (NSString *) getName {
    return self.name;
}

- (void) setAge: (int) newAge {
    self.age = newAge;
}

- (int) getAge {
    return self.age;
}

@end

看完传统实现方式,是不是很想一睹现代方式的风采?我们继续往下看:

<!-- lang: cpp -->
@implementation Person

@synthesize name;
@synthesize age;
//或者直接下面一句
//@synthesize name,age;

@end

是不是很神奇?在新版的Xcode中,@synthesize是可以省略的,但是建议还是都写上。

####3.2 “+”和“-”

仔细的读者应该已经发现在上面的传统方式中包含了一个神奇的符号“-”。这个是什么意思呢?首先我们需要说明一下,一个类可以拥有成员变量和方法,而方法可以包含类方法和实例方法。所谓类方法是可以使用类名直接调用的方法,而实例方法是需要该类的实例才可以调用的方法。而在OC中使用“+”表示该方法为类方法,而“-”很简单自然是表示实例方法了。

至于方法的声明和实现大致和传统方式声明getter和setter是一样的,这部分就不再重复了。

###第四步 运行和调试

每一个应用的开发过程都是漫长的,而在这个过程中我们免不了需要不时的运行一下程序,看看当前的效果,检查一下代码是否存在异常或者错误。

####4.1 iOS模拟器

#####4.1.1 选择设备

Xcode的强大不是吹出来的,在Xcode中内置了iOS模拟器,能够模拟几乎所有iOS真机的功能,因此开发者可以通过iOS模拟器测试正在开发中的应用程序,提高开发效率,减少错误,节省开发时间。在运行前选择与应用对应的模拟设备是必须的,否则可能导致运行结果出现意外的问题。

在Xcode的菜单栏下方提供了选择模拟器的地方,如图所示:

选择模拟器

选择好模拟器后点击左侧的Run按钮,就可以在指定的模拟器中启动应用了。第一次启动模拟器一般会比较慢,后面就好了。同样可以点击Run旁边的Stop按钮,停止模拟器中的当前应用。也许有些时候你想独立运行iOS模拟器,而不启动当前应用,这也是可以的,请看下图:

启动模拟器

也许相同的设备,但是却又多个尺寸,多个屏幕分辨率,例如:iPhone就有4、4S、5等。那怎么选择呢?别当心,有模拟器呢:

选择不同的分辨率

真是iOS模拟器在手,开发调试不用愁啊!

####4.1.2 模拟器自定义设置

看完了上面的介绍,是不是感觉有一种马上动手的冲动?先别急,还有更高级的呢!大家知道,现在很多流行的iOS应用都有定位功能,那么在模拟器怎么测试定位呢?看看下图你就明白了:

设置模拟器经纬度

####4.1.3 存储屏幕快照

开发应用程序通常都不是一步到位的,过程中可能会产生各种各样稀奇古怪的现象,也许是显示不正常,也许是出现意外的效果,也或者你想把你当前的显示效果分享给开发团队的其他成员,这个时候作为开发者,你也许想要记录出现的这些现象,比如:截图、录屏什么的。这些都是不错的方法,但是iOS模拟器拥有更加方便的方式,如图所示:

存储屏幕快照

###4.2 程序调试

每一个开发者都不能保证他的程序是完美的,所以通常在我们运行程序的时候会出现很多奇怪的警告或者错误,有的可以一目了然,迎刃而解,有的却隐藏得很深,很难发现。这时候断点调试就直观重要了。

在代码编辑器的左边的行号区,鼠标在这个区域单击可以在对应行上添加/关闭(不是删除)断点。启动断点,当再次运行程序的时候,程序若执行到当前行,则会暂停在当前行上,开发者可以在控制台看到断点处记录的信息。大致如图:

断点调试

如图所示,在断点处我们可以在控制台看到变量date的当前值以及内存地址等信息,这样就可以通过这些信息判断程序运行到该处时是否正常,也可以这样查看一些其他信息。

###4.3 NSLog

有些时候我们可能会遇到一些仅靠断点无法解决的问题,这时我们还可以借助NSLog进行调试。NSLog也用于在控制台输出信息。如图:

NSLog调试

好了,到此告一段了,希望能帮助大家。

博客地址:淘代码,乐享开发

© 著作权归作者所有

共有 人打赏支持
Mr.Zheng
粉丝 53
博文 22
码字总数 38792
作品 0
杭州
网页/平面设计
加载中

评论(32)

龙影
龙影

引用来自“solu”的评论

引用来自“Mr.Zheng”的评论

引用来自“李马燕”的评论

首先,你要有一台mac

哈哈,其实如果你有一台配置足够好的PC电脑,MAC不是必须的,虚拟机解决你的顾虑!

尝试过在虚拟机安装,但是效果不理想呀。

thinkpad x220t 6GB内存运行vm 中运行mac os x lion 10.7正常 但是还是感觉有些慢
申聚考
申聚考
出来
申聚考
申聚考
纠结
潘奇天
潘奇天

引用来自“solu”的评论

引用来自“Mr.Zheng”的评论

引用来自“李马燕”的评论

首先,你要有一台mac

哈哈,其实如果你有一台配置足够好的PC电脑,MAC不是必须的,虚拟机解决你的顾虑!

尝试过在虚拟机安装,但是效果不理想呀。

可以试试黑苹果
归海一刀
归海一刀
这里有更多相关教程http://www.gaixue.com/Search/?q=iOS&t=1
无情的猎人
无情的猎人
mark
李远超
李远超
传统的setter方法怎么会那么实现呢?希望大家付点责任吧,尤其这种标题还教程啊!入门之类的。
春洋
春洋
学习了!
兔bug
兔bug
good!
《从零开始学Swift》学习笔记(Day 1)——我的第一行Swift代码

Swift 2.0学习笔记(Day 1)——我的第一行Swift代码 原创文章,欢迎转载。转载请注明:关东升的博客 当第一次看到下面代码时我石化了,这些代码是什么东东?单词拼出来的? import Foundat...

智捷课堂
2015/08/18
0
0
一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者。本教程由 EntLib.com 团队编写。如有任何技术问题,欢迎留言。 电子版 – PDF 格式,支持iPhone、i...

entlib
2012/09/20
0
2
视频课程内容搭载周刊推广(图片)记录表【持续更新】

============4月份视频课程搭载社区周刊记录=========== 2014.4.22 头条推荐: 2-4周备考信息系统项目管理视频教程【经验分享篇】 文字链搭载: 2014年最新华为HCNP认证全套讲解视频教程 PM...

视频课程
06/26
0
0
Mac下安装ionic和cordova,并生成iOS项目

为了开发HTML5,除了最新使用React Native等之外,目前首选的为稳定的ionic+Angularjs来开发iOS和android. Ionic(ionicframework一款接近原生的HTML5移动App开发框架 会html css js就可以开发...

Michaelyn
2017/10/23
0
0
开源手机自动化测试框架iQuery入门教程(一)

上次介绍iQuery之后,已经有些朋友在开始在手机自动化测试程序里试用iQuery了,由于之前的介绍文档比较含糊,先搁置扩展iQuery使其支持多种编程语言的系列文章,补充一下iQuery的入门教程,之...

知平软件
2012/09/12
0
0
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码

iOS精选源码 快速创建menuItem控件 YHPhotoBrowser 优化的网络图片浏览 cocoaAsynSocket demo (包含客户端和服务端) SwipeMenuViewController现在支持iPhoneX和Swift4。 仿微信的提醒对话框 ...

sunnyaigd
2017/10/31
0
0
如何采用Yeoman + Grunt + Bower开发基于PhoneGap的Hybrid APP

一直想开发手机应用,也跟着教程学做了两个iOS小应用,但开发思维上的转变需要一个长期的过程,而且iOS系统功能很强大,陌生的地方也很多,很多功能不知道该自己开发还是系统上已经存在,也不...

僵尸猫
2015/06/24
0
6
iOS 9应用开发教程之iOS 9新特性

iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统。该操作系统于2015年6月8号(美国时间)被发布。本章将主要讲解iOS 9的新特...

大学霸
2015/08/05
0
0
Appuploader的安装介绍

注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需安装,Windows 64位系统点击appuploader.exe启动;如果是Linux/Windows 32位系统或Mac系统双击appuplo...

webmirror
05/11
0
0
苹果账号的分类以及注册免费苹果账号

苹果账号的分类以及注册免费苹果账号 苹果账号的分类 在苹果公司注册苹果账号,就可以成为开发成员。开发成员一共可以分为四种,如表1-2所示。 表1-2 苹果账号的成员 以下是注册一个免费的苹...

大学霸
2015/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流利阅读笔记31-20180720待学习

克罗地亚:输了世界杯,却赢了全世界 雪梨 2018-07-20 1.今日导读 1998 年,年轻的克罗地亚国家队在法国世界杯给全世界留下了不可磨灭的印象,格子军团一举夺得了季军。4 年后,克罗地亚折戟...

aibinxiao
今天
10
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
今天
1K
16
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
1
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
1
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
15
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
2
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部