zoukankan      html  css  js  c++  java
  • DataSingleton单例

     1 #pragma 单例模式定义
     2 static DataSingleton * instance = nil;
     3 +(DataSingleton *) Instance
     4 {
     5     @synchronized(self)
     6     {
     7         if(nil == instance)
     8         {
     9             [self new];
    10         }
    11     }
    12     return instance;
    13 }
    14 +(id)allocWithZone:(NSZone *)zone
    15 {
    16     @synchronized(self)
    17     {
    18         if(instance == nil)
    19         {
    20             instance = [super allocWithZone:zone];
    21             return instance;
    22         }
    23     }
    24     return nil;
    25 }
    26 + (id)copyWithZone:(NSZone *)zone {
    27     return self;
    28 }
    29 
    30 - (id)retain {
    31     return self;
    32 }
    33 
    34 - (unsigned)retainCount {
    35     return UINT_MAX;
    36 }
    37 
    38 - (oneway void)release {
    39 }
    40 
    41 - (id)autorelease {
    42     return self;
    43 }

    这种写法已经足够严谨,同时考虑了内存池以及多线程的特殊情况。Apple的官方示例,但没有包含多线程考虑。

    需要注意的是instance的初始化使用了[self new],它是alloc+init的简要写法;调用alloc由于历史原因,objc会默认调用 allocWithZone:,

    更为简洁明快的实现方式可以参考:http://eschatologist.net/blog/?p=178

     1 // One way to do this would be to create your singleton instance in +initialize since it will always be run, on a single thread, before any other methods in your class
     2 @implementation SomeManager
     3 
     4 static id sharedManager = nil;
     5 
     6 + (void)initialize {
     7     if (self == [SomeManager class]) {
     8         sharedManager = [[self alloc] init];
     9     }
    10 }
    11 
    12 + (id)sharedManager {
    13     return sharedManager;
    14 }
    15 
    16 @end

    关于alloc和allocWithZone可以参考:http://www.justinyan.me/post/1306

  • 相关阅读:
    开启CTF大门
    关于windows下scapy出现log_runtime问题
    Python关于Threading暂停恢复解决办法
    angr入门之CLE
    Linux信号量
    IDApython 命令
    Array 数组对象
    随机数 random()
    四舍五入round()
    向下取整floor()
  • 原文地址:https://www.cnblogs.com/ubersexual/p/3239003.html
Copyright © 2011-2022 走看看