模态
- 使用场景:
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方法 注意: 如果懒加载的话,那么一定要注意先判断是否已经存在 ,如果没有再去 进行实例化
- 懒加载 好处 :
- 不必将创建出的对象的代码全部都写在viewDidLoad, 代码的可读性更强
- 每个控件的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;
}
网友评论