官术网_书友最值得收藏!

1.3 第一個Objective-C程序

接下來,我們繼續使用SimpleOC項目,在導航欄中,單擊main.m文件,如圖1-7所示(已關閉右欄)。

圖1-7 命令行項目中的main.m文件

如果不小心按了鍵盤上的Command+R鍵,或者是單擊了工具欄中的小三角圖標,你會發現,在界面的下方會顯示一條信息,如圖1-8所示。

圖1-8 命令行執行結果

我們看到,輸出窗口顯示了一條“Hello World”信息,只是把名字叫錯了,我可不叫“World”。好的,我們將代碼中的“World”修改為自己的名字,這樣,Xcode就真的是好像在給我們打招呼了,如下面的代碼。

    NSLog(@"Hello, 你的名字!");

接下來,我們看看這些各種顏色的代碼都是什么情況(它們有點像航空母艦上的艦員,根據不同的顏色來區分工作崗位)。

首先是綠色的內容,它們只是說明性的文字,稱為注釋。本例中,它們都是以“//”開始的行,刪除它們不會對運行結果有任何影響,說干就干,下面就是去掉了綠色內容以后的代碼。

    #import <Foundation/Foundation.h>
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            NSLog(@"Hello, World! ");
        }
        return 0;
    }

這些代碼就是程序執行相關的內容,我們快速了解一下它們的功能。

第一行代碼是以“#”符號開頭的,它稱作預處理指令,#import指令用于導入當前代碼文件中所需要使用的資源。一般情況下,我們會導入頭文件(.h文件),這和C或C++代碼中使用的#include指令的功能是相同的。

在導入頭文件時,主要使用兩種格式:

? 使用< >包含頭文件,用于引用系統資源,主要是指Xcode中內置的一些開發資源,如代碼中的Foundation.h文件。

? 使用" "包含頭文件,用于引用“外部”資源,這里的“外部”是指非Xcode內置開發資源,如第三方或者你自己開發的代碼。

接下來的main()函數,相信學習過C語言的朋友一定不會陌生,沒錯,它就是程序的入口,代碼會從這里開始執行。在()中是函數的參數,main()中的兩個參數與C語言中的相似,其中,args帶入命令行指令和參數的數量(使用空白字符分隔),參數argv包含了這些內容。

再看@autoreleasepool指令(@開頭的語句也是一種指令),不明白是什么,我們拆開來看,就是auto release pool,自動釋放池?這是什么情況呢?實際上,這是Objective-C中一種新的內存自動管理機制,稱為ARC(Automatic Reference Counting,自動引用計數)。

在Objective-C代碼中,使用ARC技術,可以有效地對內存進行自動管理,將程序員從復雜的內存管理工作中解放出來。如果你在C語言中使用過malloc()、free()等函數手工管理過內存,就會明白我在說什么了。當然,沒有玩過C也沒關系,現在我們只需要知道,使用Objective-C編程時,在main()函數中使用@autoreleasepool指令就可以使用ARC了,如果你沒有百分之二百的信心能夠比ARC更好地管理內存,那就選擇使用ARC吧。

NSLog()函數用于顯示調試信息,其中,第一個參數是顯示的內容,可以包含格式化字符;第二個參數開始是格式化字符所對應的數據。下面的代碼會顯示一個整數的數據。

    @autoreleasepool {
        int intNum = 1;
        NSLog(@"intNum = %i", intNum);  // intNum = 1
    }

最后的return語句用于向函數的調用者返回執行結果(活兒干得怎么樣,給調用者發個信號),一般來講,代碼0就意味著任務順利完成了。對于main()函數來講,它的調用者就是操作系統。

通過代碼的執行,我們看到,第一個程序的主要功能就是顯示一條文本信息,這些信息包含在“@”中,我們稱為字符串(string)。在Objective-C中,可以使用兩種風格的字符串:

? C風格字符串,即使用字符數組(char[])組成的字符串,這種字符串除了真正的字符內容,還會由ASC II碼中的0值字符(NULL)作為結束,使用轉義字符“\0”表示。

? 字符串對象,使用NSString或NSMutableString類型處理字符串內容。前面的代碼中,使用@""定義的字符串就是NSString對象,大部分情況下,我們會使用這種字符串。

更多字符串的處理,會在第7章詳細介紹。

主站蜘蛛池模板: 独山县| 松桃| 当阳市| 文昌市| 通城县| 德州市| 兰溪市| 林西县| 米林县| 揭阳市| 洪泽县| 锦屏县| 讷河市| 南澳县| 棋牌| 同心县| 莒南县| 长武县| 宁夏| 油尖旺区| 天峨县| 新平| 岱山县| 仲巴县| 兴化市| 攀枝花市| 塔城市| 天镇县| 朝阳区| 鹿泉市| 通州市| 湖口县| 池州市| 德庆县| 万盛区| 道孚县| 都匀市| 名山县| 南和县| 怀仁县| 达拉特旗|