一、第一個oc程序
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSLog(@"Hello, Objective-C"); return 0; }
運行,控制台輸出
二、聲明變量使用類型關鍵字(int/float/long/BOOL/char等)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { int num = 100; NSLog(@"Number is: %i", num); return 0; }
運行,控制台輸出
JS中聲明變量只用var,無論何種數據類型。
三、塊級作用域
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { int num = 100; if (num > 99) { int secondNum = 200; NSLog(@"Number is: %i", num); NSLog(@"Number is: %i", secondNum); } NSLog(@"Number is: %i", num); NSLog(@"Number is: %i", secondNum); // 錯誤,編譯器會提示 return 0; }
JS中沒有塊級作用域。
四、static關鍵字
前面的局部變量通常都在每次程序進入該局部變量的作用域時分配並在離開時釋放。這類存儲稱為自動存儲(默認關鍵字auto)。
static關鍵字會在聲明變量的時候分配內存,在程序運行期間只分配一次內存。之后再訪問時,實際都是在訪問原先分配的內存。這適合用於存儲創建時使用大量的資源,並且不常改變的局部變量。
void func() { static Expensive * p = [[Expensive alloc] init]; [p doSomeOp]; } int main(int argc, const char * argv[]) { func(); // 第一次調用時創建 p func(); // 第二次調用,此時p已存在,不會再次創建 return 0; }
因為全局變量默認位於全局作用域中,所以其行為和靜態變量一樣。也就是說,它們只分配一次內存,並在整個程序運行期間保持不變。
JS中,未在function內聲明的或未使用var聲明的變量都是全局變量。
五、const關鍵字
const同樣會修改所聲明變量的內存行為,它所修飾的變量是只讀的,即第一次初始化后它的值將不能改變。通常用來聲明常量。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { const NSString *str = @"BeiJing"; str = @"ShangHai"; // 會產生一個編譯錯誤 NSLog(@"dd, %@", str); return 0; }
JS規范ES6中也增加了const關鍵字,Firefox/Chrome/Safari的最新版已經支持。node v0.8+ 也支持。
六、結構體
結構體算是一種復合數據類型,對象也是。復合數據類型由基本類型組成。定義結構體使用struct關鍵字
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // 定義一個結構體 struct Point { int x; int y; }; // 使用結構體類型 struct Point p1; struct Point p2; // 賦值使用點操作符 p1.x = 0; p1.y = 0; p2.x = 1; p2.y = 1; // 假設有個寫好的函數moveFromTo moveFromTo(p1, p2); // 從坐標中心點移動到(1,1)點 return 0; }
JS沒有所謂的結構體,但這里的點操作符類似與JS對象取屬性操作符。OC對象調用時卻不是使用點操作符。
七、類型定義 typedef (type definition)
結構體每次使用時都需要輸入struct Point,很無聊。typedef則省去了該步驟,更簡潔。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // 定義一個類型 typedef struct{ int x; int y; } Point; // 使用類型, 省去了struct Point p1; Point p2; // 賦值使用點操作符 p1.x = 0; p1.y = 0; p2.x = 1; p2.y = 1; // 假設有個寫好的函數moveFromTo moveFromTo(p1, p2); // 從坐標中心點移動到(1,1)點 return 0; }
這里,Point變為了“一等類型”,和int一樣在任何地方都可以用。注意,和struct一樣定義的是純數據類型,沒有操作(方法)。
JS沒有typedef(倒是有一個typeof), JS的function可以來定義一個純數據(this, prototype掛基本類型)。
八、