YCW'S ZONE


  • 首页

  • 标签

  • 分类

  • 归档

iOS多线程:GCD思维脑图

发表于 2020-05-09 | 分类于 iOS多线程
清晰版
阅读全文 »

iOS多线程:GCD源码分析<五>dispatch-source

发表于 2020-05-07 | 分类于 iOS多线程
dispatch_source##概述Dispatch Source是BSD系统内核惯有功能kqueue的包装,kqueue是在XNU内核中发生各种事件时,在应用程序编程方执行处理的技术。它的CPU负荷非常小,尽量不占用资源。当事件发生时,Dispatch Source会在指定的Dispatch Queue中执行事件的处理。 使用dispatch_source 最常见的用途是实现定时器,GCD timer不依赖runloop,因此任何线程都可以使用,由于使用block,不会忘记避免循环引用,定时器可以自由控制精度,随时修改时间间隔等。123456dispatch_source_t timer ...
阅读全文 »

iOS多线程:GCD源码分析<四>-dispatch_semaphore

发表于 2020-05-07 | 分类于 iOS多线程
dispatch_semaphore概述dispatch_semaphore是持有计数的信号,该信号是多线程编程中的计数类型信号。有3个api:create, wait signal。 使用 对常用资源进行加锁操作,防止多线程访问修改数据导致出现结果不一致甚至崩溃的问题: 123456//在init等函数初始化_lock = dispatch_semaphore_create(1); dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); //修改Array或字典等数据的信息dispatch_semaphore_signal(_lock) ...
阅读全文 »

iOS多线程:GCD源码分析<三>dispatch_once

发表于 2020-05-07 | 分类于 iOS多线程
dispatch_once概述dispatch_once能保证任务只会被执行一次,即使同时多线程调用也是线程安全的。常用于创建单例、swizzeld method等功能。 使用1234static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{ //创建单例、method swizzled或其他任务}); 源码分析1234//调用dispatch_once_f来处理void dispatch_once(dispatch_once_t *val, dispatch_block_t block)  ...
阅读全文 »

iOS多线程:GCD源码分析<二> dispatch_group

发表于 2020-05-06 | 分类于 iOS多线程
dispatch_group转载于深入浅出 GCD 之 dispatch_group 概述dispatch_group可以将GCD任务合并到一个组管理,也可以同时监听组内所有任务的执行情况。主要的API有以下几个,先看一下Dispatch Group的具体使用。 dispatch_group_create dispatch_group_enter dispatch_group_leave dispatch_group_wait dispatch_group_notify dispatch_group_async 使用123456789101112131415161718dispatch_g ...
阅读全文 »

iOS 多线程:GCD源码分析<一>

发表于 2020-05-05 | 分类于 iOS多线程
GCD前言在日常开发中,GCD是我们常用的多线程开发工具,它隔离了我们与线程间的直接交互,所以在使用过程中我们很少关注到GCD的底层原理。此次带着几个问题来对GCD源码进行分析。源码版本339.92.1。 dispatch_async 如何实现的,分发到主队与全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 如何实现的,为什么说 GCD 死锁是队列导致的而不是线程,死锁不是操作系统的概念么? 信号量是如何实现的,有哪些使用场景? dispatch_group 的等待与通知。 dispatch_once 如何实现? dispatch_source 用来做定时器如何实现 ...
阅读全文 »

iOS 多线程:锁

发表于 2020-04-29 | 分类于 iOS多线程
本文主要介绍iOS中常用锁的相关知识及用法,大部分概念来自于线程同步及线程锁。 原子操作问:在OC中对属性变量添加atomic修饰符,能使属性线程安全吗? 原子操作,即不可分割开的操作;该操作一定是在同一个cpu时间片中完成,这样即使线程被切换,多个线程也不会看到同一块内存中不完整的数据。 原子表示不可分割的最小单元,具体来说是指在所处尺度空间或者层(layer)中不能观测到更为具体的内部实现与结构。对于计算机程序执行的最小单位是单条指令。我们可以通过参考各种cpu的指令操作手册,用其汇编指令编写原子操作。而这种方式太过于低效。 某些简单的表达式可以算作现代编程语言的最小执行单元,某些简单的表 ...
阅读全文 »

Block深入理解

发表于 2020-04-27 | 分类于 iOS
Block深入理解数据结构定义 1234567891011121314struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *);};struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); ...
阅读全文 »

NSTimer解决循环引用的几种方式

发表于 2020-04-26 | 分类于 iOS
NSTimerNSTimer是日常常用控件,但在使用中需要注意避免循环引用的问题。NSTimer使用方式如下12345678- (void)initTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(beginTimer) userInfo:nil repeats:YES]; }- (void)dealloc { [self.timer invalidate]; self.timer = nil;} 由 ...
阅读全文 »

vue双向绑定实现原理

发表于 2020-04-25 | 分类于 web
Vue.js 双向绑定实现原理1、编译代码,将代码中的特殊模板替换成vue属性值,模板得到初始化。利用DocumentFragment存储dom,完成遍历后一次性添加到原始dom中,只发生1次渲染操作,提高性能。 2、例如input控件text发生变化时需要同步修改data中对应的属性,所以监听input控件的输入事件,如有变化就调用data中属性的set方法,实现属性值更新。为属性添加get、set方法需要使用Object.defineProperty() 覆盖原始属性的实现。这一步骤即为响应式数据绑定 3、如何让文本节点实时变化? 利用订阅发布模式,通知文本节点属性变化。将每一个属性添加 ...
阅读全文 »
123
CWY

CWY

Life is like a box of chocolates. You never know what you're gonna get.

29 日志
7 分类
11 标签
GitHub E-Mail
© 2020 CWY
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4