3 回答

TA貢獻1827條經(jīng)驗 獲得超9個贊
在Objective-C,語法@"foo"是不可變的,文字的實例NSString。它不會像Mike假設(shè)的那樣從字符串文字中生成常量字符串。
Objective-C編譯器通常在編譯單元中執(zhí)行內(nèi)部文字字符串,也就是說,它們合并了同一文字字符串的多種用法,而且鏈接程序有可能在直接鏈接到單個二進制文件的編譯單元中進行其他實習。(由于Cocoa區(qū)分可變字符串和不可變字符串,并且文字字符串也始終是不可變的,所以這可以簡單明了且安全。)
另一方面,常量字符串通常使用如下語法聲明和定義:
// MyExample.h - declaration, other code references this
extern NSString * const MyExampleNotification;
// MyExample.m - definition, compiled for other code to reference
NSString * const MyExampleNotification = @"MyExampleNotification";
此處的語法練習的重點是,通過確保即使在同一地址空間中的多個框架(共享庫)中也僅使用該字符串的一個實例,可以有效地使用該字符串。(關(guān)鍵字的位置很重要;它保證了指針本身是恒定的。)const
盡管在25MHz 68030工作站和8MB RAM的情況下燃燒內(nèi)存并不像以前那么大,但是比較字符串是否相等可能需要一些時間。確保大多數(shù)時間上相等的字符串也將成為指針相等的幫助。
舉例來說,您要按名稱訂閱對象的通知。如果您使用非恒定字符串作為名稱,則NSNotificationCenter在確定誰對該字符串感興趣時,發(fā)布通知可能會進行大量的逐字節(jié)字符串比較。如果大多數(shù)比較由于所比較的字符串具有相同的指針而短路,那么這將是一個巨大的勝利。
- 3 回答
- 0 關(guān)注
- 748 瀏覽
添加回答
舉報