2014-10-19 wcdj
摘要:本文介紹關于Objective-C的一些基礎知識,使用的環境是OS X 10.9.5,Xcode 5.1.1版本。
0 建立Hello Objective-C程式
(1) 打開Xcode,選擇Create a new Xcode project -> Application -> Command Line Tool,在Type選擇Foundation,然後完成。
(2) 修改樣本代碼。
//
// main.m
// Hello Objective-C
//
// Created by gerryyang on 14-10-19.
// Copyright (c) 2014年 gerryyang. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSLog(@"Hello Objective-C, wcdj!");
return 0;
}
(3) 編譯運作代碼。
可以使用快捷鍵Command + R,效果如下:

(4) 顯示控制台的方法
方法一:View -> Debug Area -> Activate Console
方法二:Command + Shift + C
1 代碼解析
(1) Xcode通過.m擴充名來表示檔案使用的是Objective-C代碼,應由Objective-C編譯器處理。而C編譯器處理.c檔案,C++編譯器處理.cpp檔案。在Xcode中,所有這些編譯工作預設由LLVM處理。這個編譯器能夠了解C語言的全部3個變體。
(2) #import語句與#include語句的差別。與C語言一樣,Objective-C使用頭檔案來包含結構體、符号常量和函數原型等元素的聲明。#import是由Xcode使用的編譯器提供的,Xcode在你編譯Objective-C、C和C++程式時都會使用它。#import可以保證頭檔案隻被包含一次,無論此指令在該檔案中出現了多少次。對比C語言,需要使用頭檔案衛士來保證這個工作。
(3) 架構。是一種把頭檔案、庫、圖檔、聲音等内容聚集在一個獨立單元中的集合體。蘋果将Cocoa、Carbon、QuickTime和OpenGL等技術作為架構集來提供。Cocoa的組成部分有Foundation和Application Kit架構,此外還有一套支援型架構。Foundation架構處理的是使用者界面之下的那些Layer的特性,比如資料機構和通信機制。
(4) 架構和頭檔案的關系。每個架構都是一個重要的技術集合,通常包含數十個甚至上百個頭檔案。每個架構都有一個主頭檔案,它包含了架構内所有的頭檔案,通過#import主頭檔案,就可以通路架構内的所有功能。
(5) 讀這麼多頭檔案是否會很慢?Foundation架構的頭檔案占用了近1MB的磁盤空間,包含了14000多行代碼,涵蓋了100多個檔案,隻要使用#import <Foundation/Foundation.h>來包含主頭檔案,就能獲得整個集合。也許你擔心讀取每個檔案的文本會消耗編輯器很多時間,但是Xcode非常聰明,它使用預編譯頭檔案來加快讀取速度(一種經過壓縮的、摘要形式的頭檔案)。
(6) NSLog和printf的差別。
你可以使用printf()來代替NSLog()函數,但是建議還是使用NSLog()函數,因為它添加了一些特性,比如時間戳、日期戳和自動附加換行符等。
(7) 避免命名沖突的NS字首。
(a) 事實上,Cocoa給其所有函數、常量和類型名稱都添加了NS字首。例如,NSLog()函數的NS字首表明此函數來自Cocoa而不是其他的工具包。
(b) 為什麼使用NS字首?使用字首能避免名稱沖突。由于沒有集中管理的字首系統資料庫,是以可以任意選擇字首。許多人使用他們的姓名首字母或公司名稱作為字首。
(c) NS字首的由來。知道字首的好處後,但可能還是會奇怪,為何字首是NS而不是Cocoa。NS字首的來曆要追溯至此工具包還被稱為NextSTEP的時候,當時它使NeXT Software公司的産品,蘋果公司後來收購了此公司後,沒有破壞為NextSTEP編寫代碼的相容性,繼續使用NS字首。由此可見,NS就像我的闌尾一樣,都屬于曆史遺存。
(8) NSString的用法。
@是本體。@符号是Objective-C在标準C語言基礎上添加的特性之一。@符号意味着引号内的字元串應作為Cocoa的NSString元素來處理。
一個比較容易犯的錯誤是将C語言風格的字元串傳遞給NSLog()函數,這樣将得到如下編譯錯誤:
2 使用BOOL的例子
//
// main.m
// Hello Objective-C
//
// Created by gerryyang on 14-10-19.
// Copyright (c) 2014年 gerryyang. All rights reserved.
//
#import <Foundation/Foundation.h>
BOOL areIntsDifferent (int thing1, int thing2)
{
if (thing1 == thing2) {
return NO;
} else {
return YES;
}
}
NSString *boolString(BOOL yesNo)
{
if (yesNo == NO) {
return @"NO";
} else {
return @"YES";
}
}
int main(int argc, const char * argv[])
{
BOOL areTheyDifferent;
areTheyDifferent = areIntsDifferent(5, 5);
NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));
areTheyDifferent = areIntsDifferent(23, 42);
NSLog(@"are %d and %d different? %@", 23, 42, boolString(areTheyDifferent));
return 0;
}
/*
output:
2014-10-19 20:44:09.103 Hello Objective-C[20984:303] are 5 and 5 different? NO
2014-10-19 20:44:09.105 Hello Objective-C[20984:303] are 23 and 42 different? YES
Program ended with exit code: 0
*/
參考
[1] Learn Objective-C on the Mac For OS X and iOS (2nd Edition)