概覽
前面我們已經用了幾章內容進行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的低位數據);