一、本文適合人羣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 的字符串方便的多。