一、本文适合人群java
若是你对 iPhone 感兴趣, 若是你考虑向全世界的人们展现你的创意, 若是你有一颗好奇心,
若是你打算经过开发 iPhone 程序谋生, 若是你以为苹果比 Windows 酷, 若是你认为不懂苹果的
话那么就有些不时尚的话,那么能够考虑阅读本系列。
老手也能够考虑花一点时间阅读一下,能够发帖子和笔者交流切磋。笔者发布的文章属于
公益写做,旨在为你们介绍 iPhone 开发的一些基础知识,若是能够提供宝贵意见,笔者将不胜
感激。程序员
二、工欲善其事必先利其器《论语·魏灵公》安全
第一,你须要一台苹果电脑。固然这个不是必需的条件,若是你能够在你的 Intel PC 上成
功安装 MAC OS 的话,那么请忽略这一条。
第二, 你须要去苹果网站上下载开发工具 XCODE。 注意, XCODE 是彻底免费的, 可是需
要你去注册一个帐号才能够下载。 因为 XCODE 不时的在更新,因此若是你的 MAC OS 不支持
你下载的 XCODE 的话,那么你也许须要考虑买一个最新的 MAC OS。
第三,你须要至少有 C,C++,或者 JAVA 的背景知识。不过若是你没有,那么也不用担忧,
相信阅读了笔者的文章以后应该也能够掌握。
最后须要的东西就不是必须的了,固然有的话会更好一些。这些东西是,开发者帐户(需
要付费) , iPhone 手机(在部分国家能够免费得到, 可是中国会怎么样, 笔者不是很清楚) , iPod
Touch(须要购买) 。多线程
2.一、从hello word开始(怎样构建hello word)框架
第一步, 启动 Xcode。 初次启动的时候, 也许会弹出一个“ Welcome to Xcode”的一个对话框。
这个对话框和咱们的主题没有关系,咱们能够把它关掉。
第二步,选择屏幕上部菜单的“ File->New Project” ,出现了一个让你选择项目种类的对话框。
你须要在对话框的左边选择“Command Line Utility” , 而后在右边选择“ Foundation Tool”,而后选
择“ Choose...”按钮。(开发Object-c首选Xcode)函数
注:本文将再也不讲解Xcode使用方法,Xcode使用方法很好找,在网上一搜一大堆,故在此再也不讲解。工具
看下面这段代码:学习
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here NSLog(@"Hello, World!"); [pool drain]; return 0;10 }
有过 C/C++经验的同窗看到第一行, 也许会以为有些亲切; 有过 Java 经验的同窗看到第一
行也许也会有一种似曾相识的感受。同窗们也许猜到了这是干什么用的,没错,这个正是头文
件。不过,在 C/C++里面是#include,在 java 里面是 import,这里是#import。
在 C/C++ 里面会有#include 互相包含的问题,这个时候须要 #ifdef 来进行编译的导向, 在
Xcode 里面, 同窗们能够"放心的"包含各类东西, 这个没有关系, 由于咱们的编译器有足够的“ 聪
明”, 由于同一个头文件只是被导入一次。 除了#import 变得聪明了一点以外, 和#include 的功能
是彻底同样的。
咱们再来看看咱们的另一个新的朋友 ---Foundation.h 。这个是系统框架 Foundation
framework 的头文件, 有了它你能够免费的获取系统或者说苹果公司为你精心准备的一系列方便
你使用的系统功能,好比说字符串操做等等。Foundation 框架从属于 Cocoa 框架集,Cocoa 的
另一个框架为 Application Kit,或者是 UIKit,其中前者的应用对象为 MAC OS,后者的应用
对象为 iPhone OS 。开发工具
2.1.1 、main 函数
有过 C/C++或者 java 经验的同窗们对第 3 行代码应该很熟悉了,是的你们都同样主程序的
入口都是 main。 这个 main 和 C/C++语言里面的 main 是彻底同样的, 和 java 语言在本质上也是
彻底同样的。由于 Objective-C 彻底的继承了 C 语言的特性。确切的说,不是说 Objective-C 和
C 语言很类似,而是 Objective-C 和 C 语言是彻底兼容的。网站
2.1.2关于 NSAutoreleasePool
在第 4 行,咱们遇到了另一个新鲜的东西,这就是 NSAutoreleasePool。
让我把这个单词分为三部分,NS,Autorelease 和 Pool。
当咱们看到 NS 的时候, 也许不知道是表明着什么东西。 NS 其实只是一个前缀,为了不
命名上的冲突。NS 来自于 NeXTStep 的一个软件,NeXT Software 的缩写, NeXT Software 是
Cocoa 的前身,一开始使用的是 NS,为了保持兼容性因此 NS 一直得以保留。在多人开发的时
候,为了不命名上的冲突,开发组的成员最好事先定义好各自的前缀。可是,最好不要有同
学使用 NS 前缀,这样会让其余人产生误解。
略微有些遗憾的是, Objective-C 不支持 namespace 关键字, 不知道后续的版本是否会支持。
下面咱们讨论一下 Autorelease 和 Pool。
程序在执行的时候,须要向系统申请内存空间的,当内存空间再也不被使用的时候,毫无疑
问内存须要被释放,不然有限的内存空间会很快被占用光光,后面的程序将没法获得执行的有
效内存空间。从计算机技术诞生以来,无数的程序员,咱们的无数先辈都在为管理内存进行努
力的工做,发展到如今,管理内存的工做已经获得了很是大的完善。
在 Objective-C 或者说 Cocoa 里面,有三种内存的管理方式。
第一种,叫作“Garbage Collection”。这种方式和 java 相似,在你的程序的执行过程当中,始
终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它何时开始工做,怎样工做。你只
须要明白,我申请了一段内存空间,当我再也不使用从而这段内存成为垃圾的时候,我就完全的
把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人须要消耗必定的资源,在携
带设备里面,资源是紧俏商品因此 iPhone 不支持这个功能。因此“ Garbage Collection ”不是本入
门指南的范围,对“ Garbage Collection ”内部机制感兴趣的同窗能够参考一些其余的资料,不过
说老实话“ Garbage Collection”不大适合适初学者研究。
第二种, 叫作“ Reference Counted”。 就是说, 从一段内存被申请以后, 就存在一个变量用于
保存这段内存被使用的次数,咱们暂时把它称为计数器,当计数器变为 0 的时候,那么就是释
放这段内存的时候。好比说,当在程序 A 里面一段内存被成功申请完成以后,那么这个计数器
就从 0 变成 1 (咱们把这个过程叫作 alloc) , 而后程序 B 也须要使用这个内存, 那么计数器就从
1 变成了 2(咱们把这个过程叫作 retain ) 。紧接着程序 A 再也不须要这段内存了,那么程序 A 就
把这个计数器减 1 (咱们把这个过程叫作 release) ; 程序 B 也再也不须要这段内存的时候, 那么也
把计数器减 1(这个过程仍是 release) 。当系统(也就是 Foundation)发现这个计数器变成了 0, 那
么就会调用内存回收程序把这段内存回收 (咱们把这个过程叫作 dealloc) 。 顺便提一句, 若是没
有 Foundation,那么维护计数器,释放内存等等工做须要你手工来完成。
这样作, 有一个明显的好处就是, 当咱们不知道是 A 先不使用这段内存, 仍是 B 先不使用
这段内存的时候,咱们也能够很是简单的控制内存。不然,当咱们在程序 A 里面释放内存的时
候, 还须要看看程序 B 是否还在使用这段内存, 不然咱们在程序 A 里面释放了内存以后, 可怜
的程序 B 将没法使用这段内存了。这种方式,尤为是在多线程的程序里面很重要,若是多个线
程同时使用某一段内存的时候,安全的控制这些内存成为不少天才的程序员的梦魇。
若是有同窗搞过 COM 的话,那么应该对 Release/AddRef 很熟悉了,其实 Obejctive-C 和他们
的机制是同样的。
接下来, 我须要解释一下 Autorelease 方式。 上述的 alloc->retain->release->dealloc 过程看起
来比较使人满意,可是有的时候不是很方便,咱们代码看起来会比较罗嗦,这个时候就需 要
Autorelease。Autorelease 的意思是,不是当即把计数器减 1 而是把这个过程放在线程里面加以
维护。当线程开始的时候,须要通知线程 (NSAutoreleasePool) ,线程结束以后,才把这段内存
释放 (drain) 。 Cocoa 把这个维护全部申请的内存的计数器的集合叫作 pool, 当再也不须要 pool( 水
池)的时候就要 drain(放水) 。
笔者想要说的是,虽然 iPhone 支持 Autorelease 可是咱们最好不要使用。由于 Autoreleas e
方式从本质上来讲是一种延迟释放内存的机制,手机的空间容量有限,咱们必须节约内存,确
定不须要的内存应该赶快释放掉,不然当你的程序使用不少内存的状况下也许会发生溢出。这
一个习惯最好从刚刚开始学习使用 Objective-C 的时候就养成,不然长时间使用 Autorelease 会
让你变得“懒散”,万一遇到问题的时候,解决起来会很是耗费时间的。因此,仍是关于内存管
理,咱们仍是本身动手,丰衣足食。固然笔者不是说绝对不可使用,而是当使用 Autorelease
能够明显减低程序复杂度和易读性的时候,仍是考虑使用一下换一下口味。
说到这里,可能有的同窗已经开始发晕了,认为这个东西比较难以理解。是的,笔者在这
里只是介绍一个大概的东西,在这里只要了解计数器的概念就能够了,笔者将在随后的章节里
面对这个功能加以详细论述,请同窗们放心,这个东西和 Hello World 同样简单。
关于 Pool
在使用 Pool 的时候,也要记住系统给你的 Pool 的容量不是无限大的,从这一点来讲和在
现实世界的信用卡比较类似,你能够在必定程度透支,可是若是“忘记掉”信用卡的额度的话,会形成很大的系统风险。
第三种, 就是传统而又原始的 C 语言的方式, 笔者就不在这里叙述了。 除非你在 Objective-C
里面使用 C 代码,不然不要使用 C 的方式来申请和释放内存,这样会增长程序的复杂度。
线程是什么东西?线程指的是进程中一个单一顺序的控制流。它是系统独立调度和分派的
基本单位。同一进程中的多个线程将共享该进程中的所有系统资源,好比文件描述符和信号处
理等等。 一个进程能够有不少线程,每一个线程并行执行不一样的任务。
2.1.3关于[[NSAutoreleasePool alloc] init];
关于程序第 4 行等号右边出现的括弧以及括弧里面的内容, 笔者将在后续的章节里面介绍。
在这里, 同窗们能够理解为, 经过告诉 Objective-C 编译器[[NSAutoreleasePool alloc] init] , 编译
器就会成功的编译生成 NSAutoreleasePoo 对象的代码就能够了。
2.1.4Objective-C 里面的注释
同窗们在第 6 行看到了//的注释,这个和 C++ 以及 Java 是同样的,表示这一行的内容是注
释,编译器将会忽略这一行的内容。笔者在上面说过 Objective-C 彻底兼容 C 语言,因此 C 语
言里面传统的/**/在 Objective-C 里面也是有效的。
2.1.5命令行输出 第 7 行, 咱们看到了 NSLog 这个函数。 NS 上面已经讲过了, 咱们都知道 Log 是什么意思,那么这段代码的意思就是输出一个字符串, Xcode 的代码生成器本身把字符串定义为“ Hello,World!”。 NSLog 至关于 C 语言里面的 printf, 因为咱们是在使用 Objective-C 因此笔者将会和同学们一块儿,在这里暂时忘记掉咱们过去曾经熟悉的 printf 。 有眼光锐利的同窗会发如今字符串的前面多了一个@符号,这是一个什么东西呢?如前所述,Objective-C 和 C 是彻底兼容的,可是 NSLog 这个函数须要的参数是 NSString,这样就产生了一个问题, 若是使用 C 的字符串方式的话, 为了保持和 C 的兼容性编译器将会把字符串理解为 C 的字符串。为了和 C 的字符串划清界限,在 C 的字符串前面加上 @符号,Objective-C 的编译器会认为这是一个 NSString,是一个 NSLog 喜欢的参数。 为何 NSLog 或者 Cocoa 喜欢使用 NSString? 由于 NSString 封装了一系列的字符串的方法好比字符串比较,字符串和数字相互转换等等的方法,使用起来要比 C 的字符串方便的多。