跳轉到內容

Objective-C 程式設計/入門

來自華夏公益教科書

Objective C 檔案

[編輯 | 編輯原始碼]

在 Objective C 中,檔案通常使用副檔名 .h 用於介面檔案,使用副檔名 .m 用於實現檔案。

這些 Objective C 檔案是文字檔案,包含關於如何編寫程式的指令。例如,這是一個最小的“Hello World”程式

#import <stdio.h>

int main (void)
{
	printf ("Hello world!\n");
}

#import 是一個預處理器指令,它將導致編譯器匯入檔案 stdio.h 的內容,就像它在檔案中一樣。C 程式設計師可能會立即看到此指令的一個細微差異,即 C 使用 #include 指令代替。Objective-C 程式設計師通常使用 #import 指令,它包含指定的標頭檔案,但與 #include 不同,#import 只執行一次。

Apple 的 XCode IDE

[編輯 | 編輯原始碼]

Objective-C 最常用於開發 Apple 產品 Mac OS X 和 iOS(iPodTouch、iPhone、iPad-Mini 和 iPad)的軟體。它也用於 Linux 上的 GNUStep 環境。如果您在 Mac 上開發,可以使用 Apple 的不錯的圖形使用者介面 (GUI) XCode,它是免費的。

有文件,但不要期望 Python 教程。例如,有一個關於 iOS 程式設計的教程,其中一半是關於如何使用 IDE,一半是關於建立一個簡單的手機應用程式,該應用程式從輸入欄位讀取資料,並在按下按鈕時在標籤中輸出訊息。

iOS 教程的基本步驟是

  1. 從主選單欄建立一個專案,選擇專案型別“單檢視和控制器”。
  2. 確保專案頁面左上角的專案摘要顯示正在編譯到手機模擬器,如果正在設計的 UI 是在手機上。
  3. 開啟您正在使用的裝置(手機)的主故事板檔案,並使用拖放來設計表單。
  4. 使用左上角的按鈕切換到輔助編輯器,並將故事板放在一個窗格中,並將生成的檢視控制器的介面檔案的源檢視放在另一個窗格中。
  5. 透過按住 Control 鍵並將滑鼠從使用者介面設計頁面拖動到介面檔案的原始碼,在故事板物件(欄位、按鈕)和介面檔案之間建立圖形連線。
  6. 將圖形元素控制拖動到檢視控制器的介面檔案時,會出現提示顯示選擇。簡單的常見情況是將它們設定為“出口”,這些出口提供了對使用者介面設計器中可讀或可寫的圖形元素的引用;對於按鈕元素,建立一個操作連線並填寫方法名稱。按鈕的操作通常是程式碼需要開始的地方。
  7. 還有一個名為委託的概念,在本例中,委託用於在文字欄位輸入小部件 (UITextField) 的鍵盤輸入中按下回車鍵時放棄焦點。委託只是一個處理程式,可以實現協議中定義的一組方法簽名中的一個或多個方法,在本例中,是 UITextFieldDelegate 協議。按下回車鍵時呼叫的委託方法不是“returnButtonPressed”,而是“textFieldShouldReturn”,這將在協議文件中找到。在 textFieldShouldReturn 內部,應該呼叫文字欄位的“resignFirstResponder”方法以允許鍵盤隱藏,作為對按下回車鍵的響應。
  8. 該教程使用幾個不必要但說明性的步驟來實現操作按鈕的操作,即將輸入文字複製到標籤。例如,將文字欄位的文字 NSString 屬性複製到檢視控制器的 NSString 屬性,該屬性是作為練習建立的;然後使用 allocinitWithFormat 建立一個區域性範圍的 NSString 變數,以便將文字欄位中輸入的名稱與歡迎訊息連線起來。然後將區域性 NSString 變數分配給標籤的文字屬性,該屬性具有省略的 alloc-initCopy 語義。更短但等效的是“self.label.text = [[NSString alloc] initWithFormat:@"Hello %s!", self.textField.text];”。

在此之後,可以嘗試更復雜的學習示例,例如

  • 建立一個計算器,其中公式在文字欄位中輸入,公式被解析,結果在標籤中返回。

- 這可以透過建立一個解析器-詞法分析器類來完成,該類負責對給定字串進行自頂向下的解析,並進行一次字元前瞻。解析器具有遞迴語法,方法可以表示語法中的非終結符,詞法分析器方法用於將字元的終結字串轉換為數字。如果有效計算的初始符號是“L”,那麼 L -> E 是語法的初始行,由對方法 E 的呼叫表示(例如 [ self E ];)。表示式由一個或多個用 + 或 - 分隔的項組成,並且可以遞迴地表示為

E -> T |   T + E | T - E

因此 E 可以是以下三種情況之一,T,或者如果 T 後的符號是 +,則為 T + E,或者如果 T 後的符號是 -,則為 T - EE 方法的開始可能是:-

-(void) E {
  [self T];
  char ch = [self lookahead];
  if (  ch == '+' ) {
     [self nextchar];
     [self E];
     [self plus];
  } else if ( ch == '-') {
     [self next char];
     [self E];
     [self minus];
  }
}

'plus''minus' 在最後被呼叫的原因是,正常的算術語法可以轉換為逆波蘭表示法,其中運算元可以被載入到堆疊中,操作對推送到堆疊的最後兩個運算元進行操作,並且替代實現可以是將給定的輸入字串從正常表示法轉換為逆波蘭表示法,然後遍歷該表示法以按順序進行推入/彈出/操作。否則,在本實現中,'plus' 可能看起來像

// stack is a NSMutableArray* initialised in -(id)init
-(void) plus {
  NSDecimalNumber* n2 = [stack  lastObject];
  [stack deleteLastObject];
  NSDecimalNumber* n1 = [stack  lastObject];
  [stack deleteLastObject];
  NSDecimalNumber *res = [[NSDecimalNumber alloc] initWithDouble: ( [n1 doubleValue] + [n2 doubleValue] ) ];
  [stack addObject:res];
}

plus 的另一種實現是,有一個儲存 NSString 令牌的第二個可變陣列例項,並且 'plus' 只將 '+' NSString 令牌推送到這個第二個陣列中。解析完成後,遍歷該陣列,並使用第三個可變陣列按順序處理每個令牌,推入數字令牌,併為操作彈出數字,然後推入結果。

第三種實現可以消除堆疊的使用,方法是讓操作返回數字,這些數字是應用操作或轉換數字詞素的結果。這依賴於程式堆疊不僅使用遞迴來提供語法規則的排序,還進行深度優先處理,以便中間結果儲存在呼叫者的程式堆疊幀中的堆疊中。例如,如果函式 expr 返回 [self term] + [self term],則第一次呼叫 term 的返回值在第二個呼叫 term 之前被儲存在暫存器中並被推送到 CPU 堆疊中。

語法的其餘部分類似於

  1. 項是一個因子,因子乘以項,或因子除以項,並且
  2. 因子是一個帶括號的表示式或一個實體,並且
  3. 當前唯一的實體是一個常數。

常數是對詞素的解析,詞素由(忽略空格)初始 + 或 -、數字字串和/或小數點組成,小數點出現一次。練習是寫出語法,然後設計語法的其他方法,以及常數詞法分析器。

  • 如果 T -> F | F * T | F / T,則除法不能按預期工作,因為 */ 後的 T 將遞迴執行,直到 T -> F,然後操作從最後一個 F 向後計算,因此 3/3/3 = .333 將是 3/(3/3) = 3,這不是正確的。解決方法是重新實現語法以消除右側計算。T 始終是 F 後跟 * T/ T 或什麼都不做,這可以稱為 T'Tdash,因此 T -> F T',並且 T' -> * F T' | / F T' | e。想法是透過用第三個符號 T' 包裹第一個 F 之後的可選項遞迴部分,將終止解析的 F 移動到左側,T' 始終可選地是 'e' 或空的解析。這種技術也有助於解決語法中的一些歧義,例如 if-then-statement-(optional)-else-statement -或- if-then-statement-(optional)-else...
  • 如果表示式語法規則沒有以類似的方式進行左向解析,則存在解析錯誤。

一旦解析器實現經過測試可以在測試用例上工作,那麼“Hello World”應用程式的操作按鈕實現就可以建立一個解析器來解析文字欄位的文字,並將最終的數字結果作為標籤的文字輸出,從而實現一個計算器。其他小部件,比如 UISegmentedControl,可以稍後用於實現計算器按鈕。

  • 再新增兩個文字欄位,使按鈕操作向地址傳送電子郵件,並附帶主題和正文;

GCC 命令列工具

[編輯 | 編輯原始碼]

如果您正在為除 Mac 之外的其他平臺開發,則可以使用命令列中的 GCC。GCC 是各種 GNU 編譯器的集合。GCC 具有一個從命令列工作的 Objective-C 包。如果 GCC 安裝正確,您應該能夠連結到 Objective-C 執行時庫;否則,您需要諮詢您的軟體包系統。

要使用 GCC 構建程式,您需要至少指定一個輸入檔案並將您的程式連結到 Objective-C 庫。

gcc hello.m -lobjc

您可能想要使用額外的標誌讓編譯器指出常見錯誤並抑制有關#import關鍵字的警告。

gcc -std=c99 -pedantic -Wall -Wextra -Wno-import -lobjc -o hello hello.m

程式所需的任何其他檔案或庫都需要新增到命令列。此外,gcc 允許將 Objective-C 檔案編譯成中間檔案,然後可以將這些中間檔案連結到輸出二進位制檔案。

gcc -c hello.m -o hello.o
gcc hello.o -o hello

要使用 Objective-C 的面向物件功能,您需要在檔案頂部放置以下程式碼。

#import <objc/Object.h>

其他編譯器

[編輯 | 編輯原始碼]

一般來說,編譯器名稱為objc,除非您的編譯器另有指定。

在一般情況下,您需要在頂部新增以下內容以支援物件。

#import <Object.h>


華夏公益教科書