天天看點

Learn Objective-C on the Mac For OS X and iOS (1)

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,效果如下:

Learn Objective-C on the Mac For OS X and iOS (1)

(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非常聰明,它使用預編譯頭檔案來加快讀取速度(一種經過壓縮的、摘要形式的頭檔案)。

Learn Objective-C on the Mac For OS X and iOS (1)

(6) NSLog和printf的差別。

你可以使用printf()來代替NSLog()函數,但是建議還是使用NSLog()函數,因為它添加了一些特性,比如時間戳、日期戳和自動附加換行符等。

Learn Objective-C on the Mac For OS X and iOS (1)

(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()函數,這樣将得到如下編譯錯誤:

Learn Objective-C on the Mac For OS X and iOS (1)

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)