我的iOS成长之路-1-入门

注1:我是从2011年8月份开始接触iOS开发的,到现在(2013年12月)有2年多时间了,我计划用3篇文章来总结一下我的iOS成长之路:入门、我的第一个iOS Demo和iOS开发个人提升,本文就是这个系列中的第一篇文章。

注2:本文主要以日志的形式记录我的iOS入门。共计2周时间。由于时间有点久远了,可能有些内容已经过时了。

###第一周###

2011年8月15日:今天第一次接触苹果电脑,还是一体机。在开电脑的时候遇到了一个笑话,居然找不到苹果一体机的开机键在哪里。后来还是谷歌大神告诉了我——在背后。这事太囧了。你也跟我遇到一样的笑话吗?

2011年8月16日:iOS开发环境熟悉。电脑已经安装配置好了iPhone开发环境,但是作为一名入门级选手,还是从环境的搭建开始比较好。所以我还是先来熟悉一下iOS开发环境。

iPhone开发环境通常有两种

  1. 一种是在windows xp下通过虚拟机安装苹果操作系统——俗称黑苹果,然后在进行开发环境的配置。
  2. 另外一种就是购置一台苹果电脑,在里面配置开发环境(推荐此方法)。

在配置开发环境的时候需要用到iOS SDK和Xcode。开发环境提供了一个模拟器,大多数情况下开发的应用可以在模拟器上进行测试,有些涉及到3G网络等实际环境下测试的,就需要一台iPhone手机。也建议及早的把应用部署到真机上进行测试,以避免后期部署出现不可预测的情况,来降低风险。

我今天制定的学习路线是这样的:学习obj-c开发语言,熟悉iPhone-SDK,掌握iOS开发框架。

2011年8月17日:今天完成了iPhone下HelloWorld程序编写,初步了解在iPhone中开发应用的流程。还有一些疑问需要解决:delegate的使用、mvc在iPhone下应用、Interface Builder的入门操作、iPhone应用程序框架的了解。

2011年8月18日:今天主要学习了如下内容:

  1. iOS技术概览: iOS操作系统是iPhone、iPod touch 以及iPad设备的核心,下图是iOS的框架图,由4层构成。其中Cocoa Touch层是我们在今后开发中主要接触的一层,并且建议能用这层提供的服务,尽量不用底层的,因为这样不仅可以减少代码量,也可以减少程序的复杂度。

2、对iOS中插座变量、动作、视图控制器和视图切换进行了学习。

A:插座变量(IBOutlet):是在视图控制器中定义的变量,通过IBOutlet关键字在控制器里面定义之后,在IB(Interface Builder)里面可以体现出来。

B:控制器中定义的动作主要用来响应IB里面设计好的按钮对应的事件,当然,在响应事件之前,需要需要将IB中的控件事件连接到控制器中定义的动作。

C、视图控制器:视图控制器的主要作用如下1)、创建和管理视图;2)、管理视图上显示的数据;3)、设备方向变化、调整视图大小以适应屏幕;4)、负责视图和模型之间的数据传递

在debug代码的时候遇到一个问题,就是界面上的按钮按下去了,但是写好的动作代码没有执行。得出的结论是:IB和XCode之间没有做好相关的关联(有时候会忘记了进行关联,相信熟能生巧!)

2011年8月18日:今天主要学习了iPhone开发中的两项内容,键盘的输入和屏幕旋转。

1、键盘输入:在iPhone中,用户数据的输入主要是通过触摸键盘。由于在iPhone上的应用程序受到屏幕大小的限制,有时候当输入面板弹出来的时候,会将文本控件遮挡,这时候就需要对程序进行调整。首先是通过观察键盘的状态(显示\隐藏),然后对UI重新进行布局。观察键盘状态的时候,用到了iOS里面提供的NSNotificationCenter,它的原理就是观察者模式,提供了注册、通知、删除事件三个重要功能,当键盘状态发生改变了,就是通过它告诉我们的,然后我们在根据具体情况进行UI调整。实际上,NSNotificationCenter在iOS里面用得比较多,比如说网络状况的、打电话的状态等一些系统属性都会在这里获得。

键盘状态的监听关键代码:

1
2
3
4
5
6
7
8
9
10
11
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];

2、屏幕旋转:在iPhone手机上,可能会面对不同方向屏幕上显示的UI要保持一致性。在此,我们需要知道屏幕何时方向改变了,然后对UI进行调整。

一周学习总结:通过这一周的iPhone开发学习,给我的感觉是在iPhone上做应用比较方便快捷,特别是做UI设计的时候,SDK提供了良好的环境(IB),让我在入门的阶段也能够感觉到乐趣。这不得不抱怨一下Symbian了,开发入门门槛高,UI界面开发忒不友好,程序调试让人奔溃。

下周计划

  1. 系统的学习obj-c语言。obj-c语言是iOS中推荐使用的开发语言。
  2. 学习iOS中的视图控制器、页签栏控制器、导航控制器等,以便能构建出不同类型的应用程序。
  3. 学习表视图的使用,SQLite3数据库的了解,文件的读写等。

###第二周###

2011年8月22日:今天主要学习了Objective-C 里面的如下内容(协议和分类还没有详细的学习):

  1. 类和对象(类的定义、继承、实例化、类内存的释放)。类的定义与C++等面向对象语言定义类似,都是先声明,然后实现。不过Objective-C只支持单继承,这跟C++有区别。类的扩展可以通过继承、分类和协议来进行。
  2. 消息。在Objective-C里面,想让对象完成某个处理时,需要给对象发送一条消息,这类似与C++里面的函数调用,但是与之有很大的区别,函数通常是静态绑定的,在编译程序的时候函数所执行的代码已经确定(多态除外)。而消息则是在执行时才确定的。
  3. 内存管理。通过引用计数和自动释放池来对内存进行管理。
  4. 类对象。在Objective-C中类自身就是对象,经常用来实例化一个对象,如下面的消息使用(类作为消息的接受者):[Class alloc];

Objective-C在C的基础上,实现了面向对象。其比较大的特点有:内存管理使用引用技术、自动释放池和运行时确定消息执行者、协议、分类等。

2011年8月23日:今天主要学习了Objective-C的如下内容:
分类、协议、属性和页签栏视图使用学习

  1. 分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化。下面的代码演示了如何进行分类:
1
2
3
4
5
6
7
8
9
@interface NSString (SubClass)
-(id) DoSomething();
@end
@implementation NSString (SubClass)
-(id) DoSomething(){
// do something...
}
@end

上面的代码中,第一行,SubClass为分类名字,NSString为需要增加行为的类。分类的实现与一般类的实现类似。

  1. 协议:协议是一组预定义的行为方法,这类似于java中的接口。协议分为正式协议和非正式协议,前者为采用该协议的类必须实现它定义的方法,后者为可选。协议的定义如下代码所示:
1
2
3
4
5
@protocol HandleEvent
{
-(void) HandleKeyUpEvent;
-(void) HandleKeyDownEvent : (id) sender;
}
  1. 属性:属性的作用是用来访问对象的实例变量。使用方法是在头文件(.h)中用@property来声明一个属性,然后在实现文件(.m)中用@synthesize来告诉编译器自动生成某个变量的访问器方法。如下:

    1
    2
    3
    @property (nonatomic, retain) NSString *name;
    @synthesize name;
  2. 页签栏视图使用:使用sdk提供的Tab Bar Application模板来创建页签栏视图,然后可以通过自己加入页签栏项目(TarBarItem控件)。

2011年8月24日:今天主要学习了基于导航栏视图的应用程序开发和对学习iOS中的视图控制器进行了一个回顾

  1. 基于导航栏视图的应用程序开发。页签栏应用程序适用于包含多个视图,用户可以在不同的视图间进行快速切换,这些视图涉及到的数据迁移关系不强。如果我们遇到的数据具有层次关系,比如:邮件列表视图和邮件详细信息视图两个画面具有紧密的逻辑关系【选择邮件列表中的某邮件,进入到邮件详细信息】,此时使用基于导航的视图应用程序是最好的选择。

在导航应用程序中,使用的是UINavigationController特殊视图控制器,这方便管理层次内容的导航。

  1. iOS中视图控制器学习回顾。iOS中的视图控制器主要作用是创建和管理视图,负责视图和模型中数据的交互和响应视图中的交互事件。UIViewController是iOS里面的视图控制器基本类型,还有UINavigationController和UITabBarController等集合控制器类型的视图控制器。

2011年8月25日:今天主要学习了如下内容:表视图(UITableView)sqlite数据库的使用

  1. 表视图(UITableView)的使用:表视图一般用在基于导航视图控制器应用中,在UIKit框架中,表视图以行的形式展现UI,其中每一行我们可以对其进行个性化,比如添加图标之类的。在我们的程序中也会经常用到表视图,在使用表视图的时候我们要注意两个概念:1)表视图的数据源(UITableViewDataSource),主要是为表视图提供数据的一个协议。2)表视图代理(UITableViewDelegate),主要用来处理表视图的一些事件,并对表视图进行一些编辑和删除操作。

  2. iPhone中sqlite数据库的使用。sqlite支持在iPhone中使用。sqlite是一款轻型的数据库,主要运用在嵌入式设备中,在使用中,不需要对其进行配置和管理配置,并且可以支持到2TB大的数据文件。不仅支持常用的sql语句:增删改查,还有其它一些丰富的功能:事物等。
    在iPhone中使用sqlite数据库与在其它平台中使用sqlite数据库基本不需要变化多少。这也方便在不同平台间进行复用。
    基本使用步骤:创建数据库,创建表,插入数据,查询数据。
    打开数据库代码:
    通过调用sqlite3_open函数,打开一个已经存在的数据库,如果不存在,则创建它。如下代码所示:

1
2
3
4
5
6
-(void) openDB {
if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) {
sqlite3_close(db);
NSAssert(0, @"Database failed to open.");
}
}

创建表和插入表:组合出了sql语句,然后执行sqlite提供的方法sqlite3_exec即可。如果过程中出现错误,sqlite3_exec方法也会有错误反馈。
查询内容:先组合一个查询语句,例如:@”SELECT * FROM TABLENAME”,然后实例化一个sqlite3_stmt对象,查询出来的数据放在这里面,再通过调用sqlite3_prepare_v2,和sqlite3_step两个方法对数据进行查询,查询出来的内容还需要sqlite3_column_text方法进行内容的提取。

sqlite 这是sqlite的官方网站,相关的内容,我们在使用过程中,可以在这里进行查阅。

2011年8月26日:今天主要学习了如下内容:iOS中文件的使用。
iOS提供了如下方法来进行文件的读写和管理

  1. Foundation 框架:

1)如果应用程序的数据表现形式为属性列表(property list),则可以使用NSPopertyListSerializaitonAPI把属性列表转换为NSData对象,然后可以使用NSData类提供的方法把数据写到磁盘中。

2) Foundation 框架提供了NSFileHandle类进行文件的存取操作,也提供了NSFileManager类在文件系统里面进行文件的创建和操作(删除,重命名等)。

  1. Core OS:
    1)支持C语言的接口对文件进行操作:fopen、fread和fwrite(需要import头文件:stdio.h)
    2)支持mmap和munmap,以高效的load大容量文件到内存中,以进行内容的存取。(需要import头文件:mman.h)。

下面是一些文件访存的原则,我们在创建文件或者把数据写入到文件中时,最好遵循下面的原则:
写入disk中的数据量最小化。文件的操作相对来说慢,并且是写到Flash disk中,Flash disk的寿命是有限(可擦写约1000000次)的。一些具体的细节有利于我们最小化对文件相关的操作:

1)只写文件修改过的那一部分。避免把只修改了几个字节的文件全部进行写操作。

2)当定义文件内容格式时,把需要平凡修改的内容进行分组,从而在每一次进行disk写操作时,最小化需要写入到disk中的块数。

3)如果是结构化内容组成的数据进行随机存取,则存储在SQLite数据库中。特别是,当处理的数据可能会增长到几百M时,这非常重要。

避免把缓存文件写到disk中。此规则的唯一例外是,当应用程序退出,下次再启动时,需要上次退出时的程序状态,则可以把程序退出时的状态进行存储。

基于iPhone OS-based设备的文件系统是区分大小写的,这有别于xp系统,无论什么时候,只要是在进行文件名的编码时,必须确保大小写的精确匹配,否则代码不能打开或访问文件。

一周学习总结

本周主要学习了如下内容:

  1. Objective-C语言学习,对iOS中开发使用的语言进行了全面的学习,了解了其中的基本使用。
  2. 页签栏视图控制器、导航栏视图控制器和表视图的使用,视图控制器在iOS应用中,起到非常重要的作用,是与UI进行衔接的重要部件。
  3. iOS中sqlite的使用,文件的操作。在iOS中,我们可以使用sqlite进行数据的存取,iOS也提供了对文件的操作。
  4. iPhone应用程序的首选项,在iOS中,我们可以把应用程序的一些配置数据存储在首选项中,通过首选项,进行配置。 通过本周的学习,对iOS开发有了进一步的掌握。

下周学习计划

  1. 学习iOS中的网络开发、多线程、事件处理和媒体(图像&声音),进一步学习iOS中的UI
  2. 开发一个iOS Demo

###第三周###

没有第三周啦!!!
上周计划iOS中的网络开发、多线程、事件处理和媒体(图像&声音)就在后续的日子里面学习吧。

###总结###

iOS开发的学习我感觉还是比较容易上手的,由于开发环境的限制,对于初学者来说最大的困难可能在于设备,不过相信想要学习该平台的人来说,初期的投入还是值得的。还记得毕业那会刚参加工作就学习Symbian开发,Symbian虽然有3个大分支:诺基亚支持的S60,索爱的UIQ和DoCoMo的MOAP,它们都由全球的通信巨头掌控着,但是Symbian对于初学者太难以入门了,这无疑将许多开发者挡在大门之外。当时一个HelloWorld例子就足足让我啃上一个月。紧接着二阶段构造、活动对象、调度器等都是让人头晕目眩的东西。其实心里对Symbian一直恋恋不忘,这不又多说了几句,哎!大浪淘沙!

下一篇文章我将介绍第三周和第四周做的事情:我写的第一个iOS Demo。