模态和单例

1.一个视图控制器用另一个视图控制器的视图取代它自己的视图。这就是模态(modal)视图

  模态主要有一下几种应用场景:
  
                          收集用户信息
                          
                          临时呈现一些内容
                          
                          改变设备工作模式
                          
                          显示一个新的view

  模态视图有两个=参数,分别是ModelTransitionStyle 和 ModelPresentationStyle。这两个都是枚举,分别是:
  
  ModelTransitionStyle://视图是以什么方式过渡
  
                        UIModalTransitionStyleCoverVertical
                        UIModalTransitionStyleFlipHorizontal
                        UIModalTransitionStyleCrossDissolve
                        UIModalTransitionStylePartialCurl
  modalPresentationStyle:s视图是以什么方式展现
                        UIModalPresentationFullScreen
                        UIModalPresentationPageSheet
                        UIModalPresentationFormSheet
                        UIModalPresentationCurrentContext

  模态视图跳转的最长用的两个方法:
  
  [self presentViewController:modelViewController animated:YES completion:nil];//跳去
  
  [self dismissViewControllerAnimated:YES completion:nil];
   
2.单例(singleton)

  首先单例模式是一种常见的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系
  
  统中一个类只有一个实例而且这个类易于被外界访问,如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决
  
  方案。
  
  单例模式的要点:一个是一个类只能只有一个实例;二是它必须自行创建这个实例,三是必须向整个系统提供这个实例。
  
  优缺点:
  优点:
      实例控制:单例模式会阻止其他对象实例化自己的单例对象的副本,从而保证所有对象都访问唯一实例
      
      灵活性:类可以灵活地更改实例化过程
      
   缺点:开销:虽然数量很少,但如果每次对象请求引用是都要检查是否存在类的实例,将仍然需要开销,可以通过静态
   
   初始化解决这个问题。
   
   可能的开发混淆:使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。
   
   因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
   
   对象生存期:不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类
   
   能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这
   
   样会导致单例类中出现悬浮引用。
   
   苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults],[UIApplication sharedApplication], 
   [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象
   
   单例的代码,继承与NSObject iOS中单例模式的实现方式一般分为两种:Non-ARC(非ARC)和ARC+GCD
   //Non - ARC
   
   static heroSkillHandle *heroskillhandle = nil;

+(instancetype)sharedata
{
    if (heroskillhandle == nil)
    {
        heroskillhandle = [[heroSkillHandle alloc]init];
    }
    
    return heroskillhandle;
}
   
   // ARC + GCD
   +(SingalClass*)shareInstance
   {
     //利用GCD创建一个单例模式
    //第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用    程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
    static dispatch_once_t once;
    dispatch_once(&once, ^{
    single=[SingalClass alloc];
     });
      return single;
    }



你可能感兴趣的:(模态和单例)