关于 “单例模式” 的一点思考

c++ 单例

  • class CSingleton  
  • {  
  • private:  
  •     CSingleton() {}  //构造函数是私有的  
  •     static CSingleton *m_pInstance;  
  • public:  
  •     static CSingleton * GetInstance()   {  
  •         if(m_pInstance == NULL)  //判断是否第一次调用  
  •             m_pInstance = new CSingleton();  
  •         return m_pInstance;  
  •     }  
  • };

objc 单例,objc 单例 (ARC 与 非ARC 一样写法)

  • + (NSObject *)singleton {
  •     static dispatch_once_t once;
  •     static NSObject *__obj = nil;
  •     dispatch_once(&once, ^ {
  •         __obj = [[NSObject alloc] init];
  •     });
  •     return __obj;
  • }

我的疑问 ?如下,

  [[NSObject alloc] init] 是在堆上,在ARC下 谁”维护或拥有“ 这块堆内存? 按照c++的编译原理理解,

  __obj 仅仅是一个静态变量指向一块堆内存,不能保证堆内存的存在 !

 难道 ARC 时,有做特殊处理??

于是 做进一步了解,通过clang -rewite-objc -objc-arc 和 clang -rewite-objc 都发现了 如下代码:

static struct 对象,疑惑 貌似解开了!

参考链接

http://segmentfault.com/q/1010000000176896

http://www.apkbus.com/android-593-1.html?_dsign=d4208a9f

http://blog.csdn.net/chengyakun11/article/details/16942999

原文地址:https://www.cnblogs.com/xzoscar/p/4920786.html