摘要:▶ 什么是 CoreData CoreData 是苹果公司封装的进行数据持久化的框架,是 iOS 5 之后新出来的的一个框架, 它允许按照实体-属性-值模型组织数据,并以 XML、二进制文件或者 SQLite 数据文件的格式持久化数据。CoreData 可以节省代码量:一般可达 30% 到 70%;
阅读全文
摘要:▶ 线程死锁 死锁:是指两个或两个以上的进程(线程)在执行过程中,因争夺资源(如数据源,内存等。注:变量不是资源)而造成的一种互相等待的现象!若无外部处理作用,它们都将无限等待 死锁形成的原因有 A. 系统资源不足B. 进程(线程)推迸的順序不恰当C. 资源分配不当 死锁形成的条件有A. 互斥条件:
阅读全文
摘要:▶ SceneDelegate 自 Xcode11 发布以来,当你使用新 XCode 创建一个新的 iOS 项目时 SceneDelegate 会被默认创建!在 iOS 13 后它将负责 AppDelegate 的某些功能 最重要的是 window 的概念已被 scene 的概念所代替。 一个应用程
阅读全文
摘要:▶ KVO 实现原理 我们在 Person 中声明 age属性;在 ViewController 中创建两个 Person 的实例对象,并将其中一个添加观察者,监听 age属性 // - Person.h #import <Foundation/Foundation.h> @interface Pe
阅读全文
摘要:▶ 什么是 MVVM Model-View-ViewModel 是 M-V-VM 三部分组成,它本质上是 MVC 的改进版 MVVM 就是将其中 V层 的状态和行为抽象化,其中 ViewModel 将 视图UI 和 业务逻辑 分开,它取出 M层 数据的同时也可以帮忙处理 V层 中由于需要展示内容而涉
阅读全文
摘要:▶ 什么是 MVP MVP 是 MVC 设计模式派生出来的,它经常用来创建用户界面 MVP 工作原理 A. MVP 中 Presenter 完全把 Model 和 View 进行了分离,主要的程序逻辑在 Presenter 里实现。模型与视图完全分离,我们可以修改视图而不影响模型 B. Presen
阅读全文
摘要:▶ 如何传递两个以上的参数 下面用三种方式实现 DemoA:将所有参数放入一个字典或数组传过去!这种方式需要改动要调用方法的取参数的方式,比如使用字典传值时,双方需约定每一个参数放入字典对应的 key 是什么 - (void)viewDidLoad { [super viewDidLoad]; NS
阅读全文
摘要:▶ 线程通信 在开发中我们经常会在子线程进行耗时操作,等待操作结束后再回到主线程去刷新 UI,这就涉及到了子线程和主线程之间的通信;我们先来了解一下官方关于 NSThread 线程间通信的方法 // 在主线程上执行操作 - (void)performSelectorOnMainThread:(SEL
阅读全文
摘要:▶ 常用 API 在开发中,我们经常使用到的 API 有 // 任务只执行一次 dispatch_once() // 同步执行 dispatch_sync() // 异步执行 dispatch_async() dispatch_async_f() // 延迟到的时间点执行 dispatch_afte
阅读全文
摘要:▶ 代理传值 delegate 和 block 常用于逆向传值,两者都比较好用,但还是有区别的 A. delegate 在写法上比较麻烦,一方必须设置代理,另一方必须遵循代理且实现代理!其优势是代理的回调函数可以是多个函数,在不同的时机调用不同的回调函数;也可以说在一个协议中定义多个方法,在不同的触
阅读全文
摘要:▶ 线程安全 多线程同时访问一块公共资源是一件很危险的事!下面我们来模拟多窗口售票的情景 A. 使用 NSLock 保证线程安全!NSLock 是 OC 层封装底层线程操作来实现的一种锁,继承 NSLocking 协议,在此我们不讨论各种锁的实现细节,因为基本用不到。NSLock 的使用非常简单 1
阅读全文
摘要:▶ 前言 GCD 全称 Grand Central Dispatch,是纯 C 编写,提供了多且强大的函数。在编写 GCD 相关代码的时我们要记住面对的是函数,而不是方法!GCD 存在于 libdispatch.dylib 这个库中,这个调度库包含了 GCD 的所有的东西,任何 iOS 程序默认就加
阅读全文
摘要:▶ NSOperation NSOperation 在 MVC 中属于 M 层,是用来封装单个任务相关代码和数据的抽象类。它不能够直接使用,必须使用其子类。使用⼦类有三种方式 A - NSInvocationOperation:封装了执行操作的 target 和要执行的 action B - NSB
阅读全文
摘要:▶ 前言 进程:一个正在运行的程序可以看做是一个进程,它拥有独立运行所需要的全部资源;一个进程行由一个或多个线程组成;进程只负责资源的调度和分配,线程才是程序执行的真正单元(负责代码的执行) 线程:程序中独立运行的代码段 主线程:一个正在运行的程序(即进程),至少包含一个线程,就是主线程,它在程序启
阅读全文
摘要:▶ 页面传值 下面代码中,通过 SecondViewController 向 ViewController 传值 // - SecondViewController.h #import <UIKit/UIKit.h> typedef void(^TextBlockSecVC)(NSString *t
阅读全文
摘要:▶ 为什么 block 用作属性时使用 copy 修饰 我们使用 Xcode 的 MRC模式,一步步验证:当 block用作属性时,我们分别使用 assign 和 copy 特性修饰会发生什么状况 // - ViewController .m: 1 #import "ViewController.h
阅读全文
摘要:▶ 循环引用问题 循环引用的本质问题就是双方都强引用了彼此,下面以 MRC模式 为例 // - main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Animal.h" int main(int argc, cons
阅读全文
摘要:▶ description 一般情况下使用 NSLog 和 %@ 输出某个对象时,就会调用这个对象的 description方法,其返回值就是 NSString 字符串型,默认实现返回的格式是 <类名: 对象的内存地址> 代码示例 DemoA:没有重写 description方法 #import <
阅读全文
摘要:▶ 属性传值 | 单例传值 文件目录如下 // - SingletionDemo.h #import <Foundation/Foundation.h> @interface SingletionDemo : NSObject @property (nonatomic,copy)NSString *
阅读全文
摘要:▶ 复合设计模式 1 - 在开发时往往会需要许多零碎的小控件展示在界面上!如果需要一个,就创建一个....那么这样写出的代码太过凌乱,所以采用一种合理的设计模式是很重要。下面代码中就封装了登录页面上所涉及的控件 // - LTView.h 1 #import <UIKit/UIKit.h> 2 @i
阅读全文