一、C 中的四种存储类:
- auto
- register
- static
- extern
二、 auto
- auto 是默认存储类,通常不显示的使用。
- 当运行到程序块的时候,auto 类型的变量能自动分配内存,并且在该程序块运行完成时释放。访问 auto 变量仅限于声明它们的 block,以及任何嵌套 block 内。
三、register
- register 的行为就想 auto,但不同的是它们不是被分配到堆栈中,它们被鵆在一个寄存器中。
- 寄存器能比内存提供更快的访问速度,但是由于内存管理的复杂性,把变量放在寄存器中并不能保证程序变得更快。事实上,很可能由于在寄存器上占用了不必要的控件而最终被放缓执行。使用 寄存器 世纪上只是一个给编译器存储变量的 建议 ,实现时可以选择是否遵从这一点。
- 寄存器 在 Objective-C 不够普及其实挺好的:最好还是不要使用它,因为比起其他任何明显的方式上加快应用程序,它更容易引起让人更加头疼的结果。
三、 static
- 方法或函数内部的一个 static 变量保留其调用之间的值。
- 全局声明的一个 static 变量可以被任何函数或方法被调用,只要这些方法出现在跟 static 变量同一个文件中。这同样适用于 static 方法。
- 实例:创建单例
+ (instancetype)sharedInstance {
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
四、 extern
- 当 static 使得一个特定的文件中的函数和变量全局可见,extern 则使它们对所有文件可见。
- 一般来说,全局变量并不是一个好主意。由于没有如何及何时改变值的任何限制,常常导致无法调试的错误。在 Objective-C,对 extern 有两个常见和实际的用途。
- 全局字符串常量
任何时候,如果你的应用程序要在一个公共头文件申明一个非自然语言的字符串常量,都应该将其声明为外部字符串常量。尤其是在声明诸如 userInfo 字典,NSNotification 名称和 NSError 域的时候。
该模式是在公共头文件里申明一个 extern 的 NSString * const,并在实现文件里定义该 NSString * const:- AppDelegate.h
extern NSString * const kAppErrorDomain;
- ***AppDelegate.m***
NSString * const kAppErrorDomain = @"com.example.yourapp.error";
字符串的值并没有特别的需要注意的事情,只要它是唯一的。使用字符串常量建立了严格的约束,用该常数变量来代替字符串的文本值本身。
- 公共方法
一些全局的 API(经常使用) :
//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;
}
}