iOS-基础知识--模态和单例简单总结

作者: 云之君兮鹏 | 来源:发表于2016-05-19 16:01 被阅读513次
    **怒发冲冠,凭栏处,潇潇雨歇!** <火爆猴>

    模态


    • 使用场景:

    1.调用系统相册
    2.相机
    3.临时展示一些内容(例如用户登录页面,通信录添加联系人)

    • UIKit 提供的一些专门用于模态显示的ViewController,比如UIImagePicekerController等

    • 主要用途:

    1.收集用户输入信息
    2.临时呈现一些内容
    3.临时改变工作模式
    4.相应设备方向变化
    5.显示一个新的view层级

    • 弹出风格 Modal Presentation Style

    1.UIModalPresentationFullScreen : 充满屏幕
    2.UIModalPresentationPageSheet : 代表presentedVC的高度和当前屏幕高度响度,宽度和竖屏宽度相同
    3.UIModalPresentationFormSheet : 高度宽度均小于屏幕尺寸,居中显示,四周变暗区域
    4.UIModalPresentationCurrentContext : 与父VC方式相同

    • 弹出时的动画风格 Modal Transition Style

    1.UIModalTransitionStyleCoverVertical : 从底部划入
    2.UIModalTransitionStyleFlipHorizontal : 水平翻转
    3.UIModalTransitionStyleCrossDissolve :交叉溶解
    4.UIModalTransitionStylePartialCurl 翻页

    代码示例:下面代码是模态到一个视图
    第一个yes表示,模态的时候有动画效果

    [self presentViewController:modalView animated:YES completion:nil];
    

    代码示例:下面代码作用就是将弹出的模态视图移除,
    第一个yes表示移除的时候有动画效果,
    第二参数是设置一个回调block,当模态视图移除消失后,会回到这里,可以设为nil

    [self dismissViewControllerAnimated:YES completion:^{ }]
    

    单例


    单例是一种设计模式
    实现 : 定义一个单例类, 保证程序中这个类智能创建唯一的实例对象,实现资源共享(最起步的通讯录或者是记事本可以用)

    • 单 : 代表的是唯一性,
    • 例: 代表的是实例对象.即使用某一个类创建的对象是程序中唯一的实例对象

    注 : 通常每次使用alloc创建的都是不同的对象
    如果一个类只能创建一个对象,那么称为单例类.单例类可以使工具类,视图类,控制器类

    主要优点:

    1:提供了对唯一实例的受控访问
    2:由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式可以提高系统性能
    3:允许可变数目的实例.

    缺点:

    1:由于单例模式中没有抽象层,因此单例类扩展有很大的困难
    2:单例类职责繁重,在一定程度上违背了单一职责
    3:滥用单例将带来一些负面问题,例如:为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接溢出,如果实例化对象长时间不利用,系统会认为是垃圾被回收(这里不是指垃圾回收机制,而是iOS的引用计数),导致独享状态丢失

    实现代码

    #import "DataHandle.h"
    
    static DataHandle *dataHandle = nil;
    
    @implementation DataHandle
    
    //单例实现方式
    +(DataHandle *)shareData
    {   
     if (!dataHandle)  
     {       
     dataHandle = [DataHandle new];   
     }  
      return dataHandle;
    }
    //懒加载
    -(NSMutableDictionary *)personDic
    {   
     if (_personDic == nil) 
    {       
     _personDic = [NSMutableDictionary dictionary];  
    }   
      return _personDic;
    }
    尽量少创建单例
    
    • 懒加载: 懒加载也被成为一宗延迟加载,即在需要的时候才去加载 (效率高,占用内存小),懒加载其实写的就是他的getter方法 注意: 如果懒加载的话,那么一定要注意先判断是否已经存在 ,如果没有再去 进行实例化
    • 懒加载 好处 :
    1. 不必将创建出的对象的代码全部都写在viewDidLoad, 代码的可读性更强
    2. 每个控件的getter方法中分别负责鸽子的实例化处理,代码彼此之间的独立性更强,耦合度更低
    • 考虑线程问题和单例访问的唯一性 单例标准写法改进
    static DataHandle *dataH = nil;   
    -(instancetype )standDataHandle{
       
        // 线程安全  只允许一个去访问
        @synchronized(self) {       
            if (!dataHandle)
            {
              dataHandle = [[DataHandle alloc] init];
             }    
        }     return dataHandle;
    }
    
    // 第二种:
    + (instancetype)sharedDataHandle{    
     static DataHandle *dataH = nil;   
     static dispatch_once_t onceToken;   
     dispatch_once(&onceToken, ^{       
     dataH = [[DataHandle alloc] init];    });      
     return dataH;
    
    }
    
    

    相关文章

      网友评论

      • 阿丶伦:单例可以去看看GCD的单例写法。这种单例写法还是有点缺陷的
        阿丶伦:@云之君兮鹏 加油
        云之君兮鹏: @阿丶伦 恩恩,这里只是简单一下单例,等我知识面更广时候再进行改进!谢谢你的指导

      本文标题:iOS-基础知识--模态和单例简单总结

      本文链接:https://www.haomeiwen.com/subject/pdrgrttx.html