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
查看評論