该了解的iOS(一)之基础
天天做需求,有时间也是倒腾Flutter,Swift等新技术,正好趁着疫情期间闲着无聊整理下iOS开发的基础点,温故而知新。
面向对象思想编程
编程范式和编程范型是指从事软件工程的一类典型的编程风格。常见的有以下几种,iOS采用面向对象编程思想。
- 过程化编程:将机器/汇编语言等支持过程化的编程范式的编程语言归纳为过程化编程
- 事件驱动编程:结合图形用户界面(GUI)编程。
- 面向对象编程(OOP):封装性,继承性,多态性三个基本概念,通过类,方法,对象和消息传递来支持面向对象的程序设计范式。
- 函数编程:是一种结构化编程,其核心思想是把运算过程尽量写成一系列嵌套的函数调用,在代码简介度,代码管理,并发编程上更加便捷。
- 面向切面编程(AOP):AOP可以认为是函数式编程的一种衍生范型,利用AOP可以对业务逻辑的各个部分进行隔离,使得业务逻辑各个部分之间耦合度降低,提高程序的复用性,从而提高开发效率。
封装、继承、多态
封装、继承、多态为面向对象思想的三大支柱,此外还有协议和代理等。封装是面向对象概念中最基础的,可以理解成:封住一些函数和对象,只暴露接口,隐藏实现方法;继承则是面向对象的重要概念:继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力,接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;多态一般需要结合继承一起使用,本质是子类通过覆盖或重载父类的方法,来使得对同一类对象同一方法的调用产生不同的结果。
线程与进程
进程:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
线程:线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间。
怎么防止多个线程同时读取某一块内存区域呢? 通过互斥锁
怎么保证多个线程不会相互冲突呢? 通过信号量
多线程是一种利用CPU同时处理多个任务从而提高工作效率和资源利用率的方法,当然如果线程过多会大量消耗CPU资源,且每一条线程本身也是有开销的,又会涉及线程管理,线程池解决多线程中的复用,并发及性能把控。简单的使用方案有下面几种,网上有很多详解,自行查看
- pthreads:基于C语言,可跨平台,使用难度大,自行管理生命周期,很少使用。
- NSTread:使用OC语言,简单的面向对象,使用简单,可直接操作线程对象,需自行管理生命周期,线程同步和加锁等,开销较大,适用于简单的线程场景。
- GCD:基于C语言,充分利用设备的多核,自动管理线程生命周期,提供了简洁的c语言接口,使用简单高效,使用广泛。
- NSOperation:基于GCD的一个抽象类,还可以加入操作依赖(addDependency)、设置操作队列最大可并发执行的操作个数(setMaxConcurrentOperationCount)、取消操作(cancel)等,使用广泛。
APP生命周期
iOS中应用程序状态包含Not running,Inactive,Active,Background,Suspended 五种状态。
UIViewController的生命周期awakeFromNib,loadView,ViewDidLoad,viewWillAppear, viewWillLayoutSubviews, viewWillLayoutSubviews,viewDidAppear, viewWillDisappear, viewDidDisappear
<!--首次打开app时-->
UIViewController(First start)-> loadView() -> ViewDidLoad()[only once] -> viewWillAppear() -> viewDidAppear() -> viewShow
<!--退到后台时-->
UIViewController (Quit) -> applicationDidEnterBackground() -> viewWillDisappear() -> viewDidDisappear() ->applicationWillTerminate() -> end
<!--再次打开时-->
UIViewCOntroller (Restart) -> appcationWillEnterForeground() -> applicationDidBecomeActive() ->viewWillAppear() -> viewDidAppear() -> end
设计模式
说到设计模式首先想到的就是MVC,不管是MVVM,工厂模式等都是一种思想,一种原则来实现解藕,使类的复杂度降低,减少冗余度,开发维护起来成本低。不管是简单的项目还是庞大的项目都要遵循这个原则,不至于导致项目混乱。
- MVC:model(数据) - view (视图)- controller (UI展现和数据交互的逻辑控制)
- MVVM:改良MVC的版本,将一部分逻辑从C层拿出来放到ViewModel里去处理,降低C层的冗余
- 工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类
- 单例:单一职责原则,用于进行资源共享控制
存储
- NSUserDefaults:NSuserDefault适合存储轻量级的本地数据,支持的数据类型有:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL,NSData。
<!--存-->
[[NSUserDefaults standardUserDefaults] setObject:@"value" forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];
<!--取-->
id value = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"];
- plist存储:只能是对象类型,不支持BOOL
<!--存-->
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [cachePath stringByAppendingPathComponent:@"test.plist"];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"ran" forKey:@"name"];
[dict setObject:@"18" forKey:@"age"];
[dict writeToFile:filePath atomically:YES];
<!--取-->
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [cachePath stringByAppendingPathComponent:@"test.plist"];
NSDictionary *test = [NSDictionary dictionaryWithContentsOfFile:filePath];
具体查看:https://www.jianshu.com/p/06e7403a9176
- NSKeyedArchiver归档:首先要支持NSCoding协议,并实现协议方法
<!--归档-->
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p = [[Person alloc] init];
p.name = @"ran";
p.age = @"18";
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
<!--解档-->
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject ;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath] ;
- SQLite:splite是一个轻量级,跨平台的小型数据库,可移植性比较高,增删改查等数据库操作
具体查看:https://www.jianshu.com/p/56bd21acf24f
- CoreData:其使用了对象关系映射技术,将对象转换成数据,将数据存储在本地的数据库中
具体查看: https://www.jianshu.com/p/9bcd8a29dabe
- 网络存储,上传网络服务器。
这些是iOS开发必须了解的基础,下面我会接着整理一些核心篇章。
网友评论