C存儲類

在C語言中偿渡,程序內(nèi)變量或函數(shù)的作用域壽命是由其存儲類決定的。每個變量都有其生命周期吉拳,或存儲其值的上下文适揉。函數(shù)和變量一樣煤惩,存在于一個特定的范圍可見域里魄揉,這決定了哪一部分程序知道切能夠訪問它們拭宁。

C里有四種存儲類:

  • auto
  • register
  • static
  • extern

auto

auto是默認存儲類,因此通常不需要顯示地使用杰标。當程序運行到相應代碼塊時,auto類型的變量能自動分配內(nèi)存媒区,并且在該程序塊運行完成時釋放掸犬。訪問auto變量僅限于在聲明它們的block,以及任何嵌套的block內(nèi)噪服。

register

絕大多數(shù)Objective-C程序員可能也不熟悉register胜茧,因為它沒有被廣泛的使用在NS世界里。

register行為就像auto雹顺,但不同的是它們不是被分配到堆棧中廊遍,它們被存儲在一個寄存器里。

寄存器能比內(nèi)存提供更快的訪問速度喉前,但由于內(nèi)存管理的復雜性,把變量放在寄存器中并不能保證程序變得更快裕便。事實上见咒,很可能由于在寄存器上占用了不必要的空間而最終被放緩執(zhí)行。使用寄存器實際上只是一個給編譯器存儲變量的建議下翎,實現(xiàn)時可以選擇是否遵從這一點。

建議是最好不要使用register胆萧,因為比起其他任何明顯的方式上加快應用程序郑口,它更容易引起讓人更加頭疼的結(jié)果。

static

作為關(guān)鍵字犬性,static有多重不同的用途。當涉及到存儲類時套利,static意味著以下兩件事情之一:

  • 方法或函數(shù)內(nèi)部的一個static變量保留其調(diào)用之間的值鹤耍。
  • 全局聲明的一個static變量或方法可以被任何函數(shù)或方法調(diào)用,只要這些方法出現(xiàn)在跟static變量或方法同一個文件中喊衫。

靜態(tài)單例(Static Singletons)

Objective-C 中一個常見的模式是靜態(tài)單例杆怕,在這個case里,一個靜態(tài)聲明的變量被初始化陵珍,并在任何一個函數(shù)或類方法中被返回。 dispatch once用于保證變量初始化在一個線程安全的方式下發(fā)生一次:

+ (instancetype)sharedInstance { 
    static id _sharedInstance = nil; 
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{ 
        _sharedInstance = [[self alloc] init]; 
    }); 
    return _sharedInstance;
}

單例模式對于創(chuàng)建整個應用程序共享的對象是很有用的瑟幕,諸如HTTP客戶端或一個通知管理留潦,或創(chuàng)建過程很昂貴的對象,諸如格式化殖卑。

extern

static使得一個特定的文件中的函數(shù)和變量全局可見,extern則使它們對所有文件可見懦鼠。

一般來說屹堰,全局變量并不是一個好主意。由于沒有如何以及何時改變值得限制扯键,常常會導致一些無法調(diào)試的bug。在Objective-C荣刑,對extern有兩個常見和實際的用途。

全局字符串常量

任何時候董习,如果你的應用程序要在一個公共頭文件申明一個非自然語言的字符串常量爱只,都應該將其聲明為外部字符串常量。尤其是在聲明諸如userInfo字典窝趣,NSNotification名稱和NSError域的時候训柴。

該模式是在公共頭文件里申明一個extern的NSString * const,并在實現(xiàn)文件里定義該NSString * const

AppDelegate.h
extern NSString * const kAppErrorDomain;
AppDelegate.m
NSString * const kAppErrorDomain = @"com.example.yourapp.error";

字符串的值并沒有特別的需要注意的事情幻馁,只要它是唯一的。使用字符串常量建立了嚴格的約束预麸,用該常量來代替字符串本身儒将。

公共方法

一些 API 可能會想要公開曝光一些輔助方法。出于僅提供輔助而與具體狀態(tài)無關(guān)的考慮钩蚊,用方法來封裝這些行為是一個很好的方式,而且如果特別有用鸣驱,還可能值得使其全局可用蝠咆。該模式例子如下:

TransactionStateMachine.h
typedef NS_ENUM(NSUInteger, TransactionState) {  
    TransactionOpened, 
    TransactionPending, 
    TransactionClosed,
};

extern NSString * NSStringFromTransactionState(TransactionState state);
TransactionStateMachine.m
NSString * NSStringFromTransactionState(TransactionState state) { 
    switch (state) { 
        case TransactionOpened: 
            return @"Opened"; 
        case TransactionPending: 
            return @"Pending"; 
        case TransactionClosed: 
            return @"Closed"; 
        default: 
           return nil; 
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闸翅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坚冀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件司训,死亡現(xiàn)場離奇詭異壳猜,居然都是意外死亡滑凉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門闪幽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涡匀,“玉大人,你說我怎么就攤上這事陨瘩。” “怎么了帚湘?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵甚淡,是天一觀的道長。 經(jīng)常有香客問我资柔,道長,這世上最難降的妖魔是什么贿堰? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任啡彬,我火速辦了婚禮故硅,結(jié)果婚禮上契吉,老公的妹妹穿的比我還像新娘诡渴。我一直安慰自己菲语,他們只是感情好妄辩,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布眼耀。 她就那樣靜靜地躺著佩憾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楞黄。 梳的紋絲不亂的頭發(fā)上抡驼,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音碎税,去河邊找鬼。 笑死雷蹂,一個胖子當著我的面吹牛杯道,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虐杯,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昧港,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了达舒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤昨登,失蹤者是張志新(化名)和其女友劉穎贯底,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽捆,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年琐凭,在試婚紗的時候發(fā)現(xiàn)自己被綠了统屈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙躺。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惩淳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情思犁,我是刑警寧澤进肯,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站学辱,受9級特大地震影響环形,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抬吟,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望危队。 院中可真熱鬧聪建,春花似錦茫陆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讨盒。三九已至,卻和暖如春返顺,著一層夾襖步出監(jiān)牢的瞬間蔓肯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工秉扑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舟陆,地道東北人耻矮。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓裆装,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哨免。 傳聞我的和親對象是個殘疾皇子茎活,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 版權(quán)聲明:本文為 gfson 原創(chuàng)文章,轉(zhuǎn)載請注明出處琢唾。注:作者水平有限载荔,文中如有不恰當之處,請予以指正采桃,萬分感謝...
    gfson閱讀 2,899評論 0 6
  • 注:這是第三遍讀《C語言深度解剖》身辨,想想好像自從大學開始就沒讀完過幾本書丐谋,其中譚浩強的那本《C語言程序設計(第四版...
    HavenXie閱讀 1,716評論 1 6
  • 1、c語言的函數(shù)有以下特點: (1)才源程序由函數(shù)組成煌珊,一個主函數(shù)main()+若干其他函數(shù) C程序中的函數(shù)類似文...
    滕王閣序閱讀 1,330評論 0 6
  • 以前在網(wǎng)絡上看到一篇文章号俐,大意就是每天和孩子交流四個問題,勝過每天輔導孩子作業(yè)定庵。 1吏饿,學校有什么好事發(fā)生嗎? 2蔬浙,...
    彪悍另一只貓閱讀 381評論 2 2
  • 吶途凫!做人呢溢吻,最重要就是開心促王。 雖然港臺TVB里的經(jīng)典臺詞是要人開心,但記憶中除了結(jié)局很圓滿且蓬,其實人物大多時候是不開...
    Hi_Yon閱讀 1,476評論 0 0