staic 用于局部变量主要是想要变量在局部可以保存修改。
static在用于全局变量时主要用来将变量限制在当前编译单元不向全局符号表注册。
#import "FTMNetworkFetcher.h"
static const NSTimeInterval kRequestMaxTime = 5.0; // 最长等待时间5s
@interface FTMNetworkFetcher () {
struct {
unsigned int didReceiceData :1;
unsigned int didFailWithError :1;
} _delegateFlags;
}
@end
@implementation FTMNetworkFetcher
- (void)setDelegate:(id<FTMNetworkFetcherDelegate>)delegate {
_delegate = delegate;
_delegateFlags.didReceiceData = [_delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)];
_delegateFlags.didFailWithError = [_delegate respondsToSelector:@selector(networkFetcher:didFailWithError:)];
}
@end
如果上面的例子中没有static:
const NSTimeInterval kRequestMaxTime = 5.0; // 最长等待时间5s
那么当另外的文件中也有一个不是static的kRequestMaxTime,命名空间就冲突了,一个空间里有两个相同名字的东西,因为放到全局来看,全局变量和类名就一样了,我们总是不会起两个一样的类名的。
还有一种情况,我确实想要注册到全局符号表,但是不向让用户看到,比如一些通知的定义。
---------------- interface ----------------
extern NSString *const FTMNetworkStatusChanged;
---------------- implementation ----------------
NSString *const FTMNetworkStatusChanged = @"FTMNetworkStatusChanged";