有些时候我们需要在类中添加某个在类中全局可用的变量,为了避免污染作用域,一个比较好的做法是在.m文件中使用static变量:
static NSOperationQueue * _personOperationQueue = nil;
@implementation XYZPerson
...
@end
由于static在编译期就是确定的,因此对于 NSObject 对象来说,初始化的值只能是 nil。如何进行类似 init 的初始化呢?可以通过重载 initialize 方法来做:
@implementationXYZPerson
- (void)initialize {
if(!_personOperationQueue) {
_personOperationQueue = [[NSOperationQueuealloc] init];
}
}
@end
为什么这里要判断是否为 nil 呢?因为initialize方法可能会调用多次,后面会提到。
如果是在 Category 中想声明全局变量呢?当然也可以通过 initialize,不过除非必须的情况下,并不推荐在 Category 当中进行方法重载.
有一种方法是声明 static 函数,下面的代码来自AFNetworking,声明了一个当前文件范围可用的队列:
static dispatch_queue_t url_session_manager_creation_queue() {
staticdispatch_queue_taf_url_session_manager_creation_queue;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL);
});
return af_url_session_manager_creation_queue;
}
下面介绍一个有点黑魔法的方法,除了上面两种方法之外,我们还可以通过编译器的__attribute__特性来实现初始化:
__attribute__((constructor))
static void initialize_Queue() {
_personOperationQueue = [[NSOperationQueuealloc] init];
}
@implementation XYZPerson (Operation)
@end
网友评论