Objective C 建立常量

2022-03-12 05:07:18 字數 1564 閱讀 3123

新部落格wossoneri.com

#define巨集定義

#define是一條預編譯指令, 編譯器在編譯階段前期會將所有使用到巨集的地方簡單地進行替換.

在預處理器裡進行文字替換,沒有型別,不做任何型別檢查,編譯器可以對相同的字串進行優化。只儲存乙份到 .rodata 段。甚至有相同字尾的字串也可以優化,你可以用gcc 編譯測試,"hello world" 與 "world" 兩個字串,只儲存前面乙個。取的時候只需要給前面和中間的位址,如果是整形、浮點型會有多份拷貝,但這些數寫在指令中。佔的只是**段而已,大量用巨集會導致二進位制檔案變大

#define可以使用型別定義,比如

#define my_int_constant ((int)123)
const

const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干個拷貝

如果在乙個指定單一類裡宣告常量,在.m 檔案頂端用 static const 宣告

static nsstring *const mythingnotificationkey = @"mythingnotificationkey";
如果常量屬於乙個類,但又要其他類可以訪問,在標頭檔案將其宣告為 extern ,在.m檔案定義

//.h

extern nsstring *const mythingnotificationkey;

//.m

nsstring *const mythingnotificationkey = @"mythingnotificationkey";

如果它們是全域性的常量,在標頭檔案宣告,並在相應模組裡定義。

enum

enum擁有define和const兩者的優點,不過enum只能定義整型常量。

如何選擇

盡量選擇使用const,因為編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率比巨集定義要高。

相反,define佔據更多的記憶體空間,因為它只是文字替換,導致存在過多的拷貝。當然這一點是對於一般型別的常量來說的。對於int型常量,引用const的地方拿到的是記憶體位址,位址資料和int差不多,所以記憶體上應該不會有太大區別。

另外,const對編譯器和偵錯程式來說更加友好。這一點可以作為乙個很重要的參考。

記錄比較粗略,只是簡單整理一下網友討論,這裡用到的具體的語法還是要自己去研究,比如const *int 和 int *const的區別等。

#define vs const in objective-c

what is the best way to create constants in objective-c

Objective C 常量的設定

常量的設定,可以使用預處理巨集定義 define,還有使用 extern c 關鍵字。這裡記錄後者。h 檔案 import extern nsstring const url test 測試鏈結 m 檔案 nsstring const url test 這裡賦值 呼叫的方法 nslog url te...

Objective C中的常量

在cocoa開發過程中,偏好設定中的鍵名使用 constantnsstring儲存。我認為這是乙個很好的idea,因為在必要的時候該方式允許我們方便改變常量值,而且,符合將資料和邏輯分離的理念。有沒有一種好方法可以讓這些常量在整個應用程式中定義一次?我確信有一種簡單而聰明的方法,但是現在我的類只是重...

正確定義Objective C常量

本文由 migrant 本文只是乙個關於如何在cocoa 中定義常量的書籤貼,答案來自於stackoverflow.com的這個問題。這裡為那些懶人提供了一些簡短的介紹和帖子本身。你可能讀遍了蘋果開發者文件,知道一些特定的方法引數只能接受定義為常量的列舉值列表。比如事件型別標記 nskeyupmas...