如何在类中添加全局变量

2017-03-01  本文已影响95人  pzb

有些时候我们需要在类中添加某个在类中全局可用的变量,为了避免污染作用域,一个比较好的做法是在.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

上一篇 下一篇

猜你喜欢

热点阅读