一、C 中的四種存儲類:
- auto
- register
- static
- extern
二、 auto
- auto 是默認存儲類,通常不顯示的使用。
- 當運行到程序塊的時候,auto 類型的變量能自動分配內存,并且在該程序塊運行完成時釋放。訪問 auto 變量僅限于聲明它們的 block,以及任何嵌套 block 內。
三、register
- register 的行為就想 auto,但不同的是它們不是被分配到堆棧中,它們被鵆在一個寄存器中。
- 寄存器能比內存提供更快的訪問速度,但是由于內存管理的復雜性,把變量放在寄存器中并不能保證程序變得更快。事實上,很可能由于在寄存器上占用了不必要的控件而最終被放緩執(zhí)行。使用 寄存器 世紀上只是一個給編譯器存儲變量的 建議 ,實現(xiàn)時可以選擇是否遵從這一點。
- 寄存器 在 Objective-C 不夠普及其實挺好的:最好還是不要使用它,因為比起其他任何明顯的方式上加快應用程序,它更容易引起讓人更加頭疼的結果。
三、 static
- 方法或函數(shù)內部的一個 static 變量保留其調用之間的值。
- 全局聲明的一個 static 變量可以被任何函數(shù)或方法被調用,只要這些方法出現(xiàn)在跟 static 變量同一個文件中。這同樣適用于 static 方法。
- 實例:創(chuàng)建單例
+ (instancetype)sharedInstance {
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
四、 extern
- 當 static 使得一個特定的文件中的函數(shù)和變量全局可見,extern 則使它們對所有文件可見。
- 一般來說,全局變量并不是一個好主意。由于沒有如何及何時改變值的任何限制,常常導致無法調試的錯誤。在 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";
字符串的值并沒有特別的需要注意的事情,只要它是唯一的。使用字符串常量建立了嚴格的約束,用該常數(shù)變量來代替字符串的文本值本身。
- 公共方法
一些全局的 API(經(jīng)常使用) :
//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;
}
}