概覽
前面我們已經用了幾章內容進行C語言介紹,當然要通過幾篇文章完整的介紹C語言的知識是不太現實的,例如C語言的檔案操作、記憶體申請等我們都沒有重點介紹,當然核心知識點基本都已經提到了,後面有時間我們會繼續擴充。今天我們正式開始學習Objective-C,以後簡稱“ObjC”,ObjC是在C語言的基礎上加上了一層物件導向的特性,它完全相容C語言,甚至可以混寫C++。它是Mac OS X和IOS的主要開發語言,從IOS釋出之後可以說ObjC的地位呈直線上升趨勢,當前ObjC已經是僅次於C語言、Java的第三大程式語言。今天我們先簡單的看一下C語言的一些基礎內容:
第一個ObjC程式
開啟Xcode,建立一個新專案
選擇命令列程式
選擇程式語言為Ojbective-C並輸入專案名稱
選擇儲存目錄
預設生成一個基本的專案結構
程式原始碼
// // main.m // Basics // // Created by Kenshin Cui on 14-2-1. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0; }
上面是通過Xcode建立的第一個ObjC程式,這是一個經典的“Hello,World!”。執行結果如下:
下面對上面的程式碼做一下簡單解釋:
- 首先#import是一個匯入命令,類似於C語言的#include命令,但是相對於#include而言,#import有效的處理了重複匯入的問題,在C語言中也提到過如何通過條件編譯解決重複匯入,而在ObjC中你不需要處理了,#import已經自動進行了重複處理;與#include類似,匯入系統類庫使用<>,匯入自定義類庫使用””;
- Foundation.h是Foundation框架中的標頭檔案,這是ObjC中的一個基礎類庫,基本上後面我們用到的所有ObjC的程式碼都需要引入這個類庫;
- @autoreleasepool是ObjC的關鍵字,它的作用是對包含在這個關鍵字後面大包括內的程式會自動進行記憶體回收,不需要開發人員手動釋放無用的物件;當然表面上看起來這有點類似於C#和Java的記憶體垃圾回收機制,但是事實上他們的原理完全不同,以後再做具體解釋。
- NSLog是標準輸出函式,類似於C語言中的printf()函式,但是它會自動換行,當然它同樣支援格式輸出(例如%i表示輸出整形資料,%f輸出浮點型資料),這個函式在Fundation.h中宣告;
- @”Hello,World!”,是一個字串常量,在ObjC中字串前需要使用@符號;
擴充套件--OjbC語法特點
- ObjC中沒有名稱空間(C#)或包(Java)的概念,那也就是說在同一個應用中不能同時存在兩個完全相同的類名,通常情況下我們通過字首加以區分,例如在ObjC中的NSString、NSLog中的NS就是字首。
NS其實是NeXTSTEP縮寫,是賈伯斯離開蘋果後在NeXT公司所開發的系統,這個作業系統在當時雖然沒有獲得廣泛認同,但是卻為後面Mac OX奠定了基礎。
- ObjC中很多關鍵字都是以@開頭(例如@autoreleasepool、@interface、@protocol),另外需要注意的是為了區分C語言中的字串,ObjC中的字串也必須加上@。
基本資料型別
在ObjC中的基本資料型別除了C語言中的char、int、float、double之外還有:
- BOOL型別,包含兩個值YES和NO,其實ObjC中的布林型別就是整數1和0;
- id型別,是一個物件型別,可以表示所有物件;
- NSString是Fundation框架中定義的字串型別;
// // main.m // Basics // // Created by Kenshin Cui on 14-2-1. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { char a='a'; int b=1; float c=8.5; double d=8.5e+12; char e='a'; BOOL f=YES,g=NO; NSLog(@"a=%c,b=%i,c=%f,d=%f,e=%c,f=%i,g=%i",a,b,c,d,e,f,g); //結果:a=a,b=1,c=8.500000,d=8500000000000.000000,e=a,f=1,g=0 NSString *str=@"Hello,World!"; NSLog(@"str=%@",str); //結果:str=Hello,World! NSLog(@"object=%p",nil);//結果:object=0x0 } return 0; }
關於上面id型別在這裡不做過多的解釋,後面我們會專門說到,下面列出常用格式符:
注意
1.在C或者ObjC中整形可以使用%i也可以使用%d來格式化,只有使用scanf()輸入的時候二者才有區別(由於%d始終被編譯器解釋為decimal intergeer所以即使輸入010會被認為是整形10,而%i則會將前面的0或者0x認為此輸入是八進位制或十六進位制整數);
2.%p本質就是輸出指標地址,在32位編譯器下對於一個指標型別使用%x輸出和%p輸出其實是一樣的,只是後者會在前面加上“ox”(注意在64位編譯器下由於指標長度8byte,而整形只有4byte所以%x輸出的內容只是%p的低位資料);