三、static和extern的作用

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";
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容