Objective-C基礎之物件導向編程(OOP)的基礎知識(1)——間接,objective-coop

來源:互聯網
上載者:User

Objective-C基礎之物件導向編程(OOP)的基礎知識(1)——間接,objective-coop

因為Cocoa是基於OOP概念的,並且Objective-C也是一種物件導向的程式設計語言,所以在學習Objective-C的時候必然頻繁討論OOP概念。


0x01 什麼叫間接?


間接(Indirection)是一個OOP的關鍵概念,可以理解為“在代碼中通過指標間接擷取某個值,而不是直接擷取”。



0x02 變數與間接


基本變數就是間接的一種實際應用,例如使用變數表示迴圈次數,如果想改變迴圈次數,只需修改代碼中的變數值即可:

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){  int count = 100;          //變數count起到間接的作用  NSLog (@"The numbers from 1 to %d:", count);  for (int i = 1; i <= count; i++)   NSLog (@"%d\n", i);  return 0;}


0x03 使用檔案名稱的間接


在程式中內建的片語串列表

假設有一個程式可以統計並輸出多個片語串的長度:

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){  const char *words[4] = {    "Joe-Bob \"Handyman\" Brown",    "Jacksonville \"Sly\" Murphy",    "Shinara Bain",    "George \"Guitar\" Books" };      //片語串列表  int wordCount = 4;                  //需統計的數目   for (int i = 0; i < wordCount; i++)   NSLog (@"%s is %lu characters long", words[i], strlen(words[i]));  return 0;}

在這個程式中,如果我們經常要修改片語串列表,就必須頻繁改動程式,還要同步修改需統計的數目變數。萬一單詞數目眾多,我們就必須進行大量的修改工作,還得十分謹慎保證不犯錯。從物件導向的角度來講,這樣是不科學的。


把片語串列表放入文字檔

所以,我們可以用另外一種思維構造程式:

將所有單詞都移動到代碼之外的某個文字檔中,按一定規則群組織檔案結構,如一行一個名字,這也是一種間接。

先構造一個文字檔(word.txt),並存放在tmp目錄中:Joe-Bob "Handyman" BrownJacksonville "Sly" MurphyShinara BainGeorge "Guitar" Books


再構造一個程式讀取該文字檔:

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){  FILE *wordFile = fopen ("/tmp/words.txt", "r");          //tmp是Unix的臨時目錄,電腦重啟時會被清空  char word[100];  while (fgets(word, 100, wordFile))  {  //把分行符號替換成Null 字元  word[strlen(word) - 1] = '\0';  NSLog (@"%s is %lu characters long", word, strlen(word));  }  fclose (wordFile);  return 0;}

採用這種方案之後,我們可以在文字檔中隨時改變片語串的組合,而不必修改程式,避免原始碼遭到破壞。但是這個方案仍然不夠便利,檔案路徑沒法由使用者指定,萬一檔案不在程式指定的位置,我們同樣必須修改原始碼。


用命令列參數指定檔案名稱

所以,我們要做進一步改進:

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){  if (argc == 1)          //驗證使用者是否提供了路徑名作為啟動參數,argc的值至少為1,如果使用者提供了路徑名,則argc必然大於1  {  NSLog (@"you need to provide a file name");  return 1;               // argc = 1時表示沒有檔案可讀取  }   //如果argc > 1,則按路徑讀取檔案  FILE *wordFile = fopen (argv[1], "r");  char word[100];  while (fgets(word, 100, wordFile))  {  //把分行符號替換成Null 字元  word[strlen(word) - 1] = '\0';  NSLog (@"%s is %lu characters long", word, strlen(word));  }  fclose (wordFile);  return 0;}

其中,我們通過查看argv數組來獲知片語串檔案的路徑。argv[0]存放著程式名,argv[1]儲存著使用者提供的檔案名稱。


如果在終端應用中運行此程式,那麼在命令列中指定檔案名稱則如下所示:

$ ./Word-Length-4 /tmp/words.txtJoe-Bob "Handyman" Brown is 24 characters longJacksonville "Sly" Murphy is 25 characters longShinara Bain is 12 characters longGeorge "Guitar" Books is 21 characters long


關於在調試運行前設定檔案路徑,請參考:

Xcode使用入門——在運行程式時提供檔案路徑


   
0
0
查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.