• iOS单例


    转自:http://blog.csdn.net/yangzychina/article/details/9305533

    最近在面试,有些总是会被问到,突然觉得自己虽然做了有一年多的iOS,也自己开发过几款应用,但是有些基础终究感觉自己狠模糊。
    从现在起开始看中基础,理论。

     
    被问到的两个比较多的问题, 单例以及什么是KVO和KVC。
    首先说单例模式。
     
    单例的概念(Singleton):创建某类对象时,无论创建多少次该类对象只有一份在内存中,通俗的将就是只存在这个类的一个势力对象。
    在iOS中,有两种单例实现模式,以下为例子。
    1.使用 static 管理
    @interface Singleton:NSObject
     
    @end
     
    @implement

    static Singleton*sharedSingleton= nil;

    +(Singleton*) sharedInstance{ 
     
      @synchronized(self)
      {     
         if (sharedSingleton== nil)
         {          
            sharedSingleton= [[Singleton alloc] init];       
         }   
      }
      return sharedSingleton
    }

    +(id) allocWithZone:(NSZone *)zone
    {   
       @synchronized(self)
       {       
          if (sharedSingleton== nil)
         {   
            sharedSingleton= [super allocWithZone:zone];     
             returnsharedSingleton;      
         }
       }   
       return nil; 
    }

    - (id)copyWithZone:(NSZone *)zone{

    return self;

    }

    -(id)retain{

    return self;

    }

    - (void)release{

    //do nothing

    }

    -(id)autorelease{

    return self;

    }

    @end

    使用synchronized()可以防止多个线程同时执行该段代码(线程锁)

    NSZone: 简单来说可以把它想象成一个内存池,alloc或者dealloc这些操作都是在这个内存池中操作的,cocoa总是会分配一个默认的NSZone,任何 默认内存操作都是在这个zone上进行的,使用默认zone存在缺陷,因为他是全局范围的,频繁使用会导致内存的碎片化,尤其是大量的alloc和 dealloc的时候,性能上会受到一定影响。因为你可以自己生成一个zone并将alloc,copy这些限制在这个zone中。

     

    第二种是使用 GCD,不用synchronized,比较官方的例子

     

    @implement

    static Singleton*sharedSingleton= nil;


    +(Singleton*) sharedInstance{ 

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

    sharedSingleton = [super allocWithZone:nil] init];

    }

    return instance;

    }

     

    +(id) allocWithZone:(NSZone*)zone {return[self sharedInstance];}

     

    @end

     

    以下是苹果官方的例子。

     

    static MyGizmoClass *sharedGizmoManager = nil;
     
    + (MyGizmoClass*)sharedManager
    {
        if (sharedGizmoManager == nil) {
            sharedGizmoManager = [[super allocWithZone:NULL] init];
        }
        return sharedGizmoManager;
    }
     
    + (id)allocWithZone:(NSZone *)zone
    {
        return [[self sharedManager] retain];
    }
     
    - (id)copyWithZone:(NSZone *)zone
    {
        return self;
    }
     
    - (id)retain
    {
        return self;
    }
     
    - (NSUInteger)retainCount
    {
        return NSUIntegerMax;  //denotes an object that cannot be released
    }
     
    - (void)release
    {
        //do nothing
    }
     
    - (id)autorelease
    {
        return self;
    }

     

    如果人家让你写单例,你能够准确无误的写出单例,肯定会成功率比较高。加油

  • 相关阅读:
    br_
    -fpic -fPIC -fpie -fPIE
    (OK) cross_compile_readline_for_android-x86_64-6.0
    Installing the GNU Readline library
    How to get libreadline for Android?
    (OK)(OK) seem-tools-init-android-x86_64-6.0-rc1-0.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh---nic1_2-hostonly-bridged
    (OK)(OK) seem-tools-auto_create_vm_android.sh
    (OK) run my script at boot time in android-x86_64 (Chih-Wei Huang)
    【习题 3-4 UVA
  • 原文地址:https://www.cnblogs.com/wangpei/p/3508965.html
Copyright © 2020-2023  润新知