
runtime和多线程(包含runloop)
文章平均质量分 94
想名真难
这个作者很懒,什么都没留下…
展开
-
dispatch_queue_set_specific给队列设置特有数据
想要让某个任务在指定队列中以同步的方式执行完后, 继续执行其他任务.这样说有点抽象, 举个具体的例子, 在队列A中执行任务1, 任务1完成后到串行队列B中执行任务2, 任务2完成后再回到队列A执行后续的任务3,4,...看起来很简单, 很快写下了这样的代码dispatch_queue_t queueA = dispatch_queue_create("AA", NULL);dispatch_queue_t queueB = dispatch_queue_create("BB", NULL);原创 2022-04-05 17:58:22 · 1252 阅读 · 0 评论 -
ios 原子属性nonatomic/atomic
原子属性 (Atomic Properties)你曾经好奇过 Apple 是怎么处理 atomic 的设置/读取属性的么?至今为止,你可能听说过自旋锁 (spinlocks),信标 (semaphores),锁 (locks),@synchronized 等,Apple 用的是什么呢?因为 Objctive-C 的 runtime 是开源的,所以我们可以一探究竟。在MRC下, 一个非原子的 setter 看起来是这个样子的:- (void)setUserName:(NSString *)user原创 2022-03-27 13:41:21 · 2193 阅读 · 0 评论 -
iOS中常见的类簇及其子类
类簇类簇是Foundation框架广泛使用的设计模式。类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面向对象框架的公共可见体系结构,而不会降低其功能丰富度。类簇是基于抽象工厂设计模式的。我将苹果官方文档中的有关类簇的部分翻译了过来,抽象工厂抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。很多人会混淆抽象工厂模式和工厂模式。实际上,两种的差别还是比较明显转载 2021-12-01 10:41:29 · 632 阅读 · 0 评论 -
dispatch_io,文件读写
网上看了好多关于GCD的博客大部分都是关于异步,同步线程这些问题,在无意中翻阅文档的时候看到dispatch_io_t这个东西.发现GCD也可以用来对数据进行读取(Read/Write)操作,于是我决定仔细看看API,研究研究用法。首先dispatch读取数据是属于 数据持久化的一种方式,相对于我们平常用的wirteToFile和其他的方式,dispatc可以分次读取,可以设定low_Water或者high_Water,也就是每次读取的下限和上限,我们利用这一点可以监控整个读取过程的progress,在转载 2021-07-25 23:15:08 · 1016 阅读 · 0 评论 -
iOS-unrecognized selector crash防护
避免崩溃问题的最好办法就是不产生崩溃。在开发的过程中就要尽可能地保证程序的健壮性。但是,人又不是机器,不可能不犯错。不可能存在没有 BUG 的程序。但是如果能够利用一些语言机制和系统方法,设计一套防护系统,使之能够有效的降低 APP 的崩溃率,那么不仅 APP 的稳定性得到了保障,而且最重要的是可以减少不必要的加班。Objective-C 语言是一门动态语言,我们可以利用 Objective-C 语言的 Runtime 运行时机制,对需要 Hook 的类添加 Category(分类),在各个分类的.转载 2021-05-05 19:20:56 · 1196 阅读 · 0 评论 -
dispatch_once造成的死锁问题
在开发中使用单例是最经常不过的事儿了,最常用的就是dispatch_once这个函数,这个函数可以使其参数内的block块只在全局执行一次从而达到目的,不过这个函数要是用的稍微“巧”了的话,就会出问题。比如看下面这段代码:#import "TestA.h"@implementation TestA+(TestA *)shareInstanceA{ static TestA *testa = nil; static dispatch_once_t token; disp转载 2020-12-27 20:43:37 · 1378 阅读 · 0 评论 -
深入解析 autoreleasepool
http://blog.sunnyxx.com/2014/10/15/behind-autorelease/https://draveness.me/autoreleasepool/Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj autorelease]来延迟内存的释放是一件简单自然的事,ARC下,我们甚至可以完全不知道Autorelease就能管理好内存。而在这背后,objc和编译器都帮我们做了哪些事呢,它们是如何协作来正确管理内存的呢?刨根问底,一起来探究下..转载 2020-08-15 18:57:43 · 757 阅读 · 0 评论 -
iOS开发中的锁实现猜测
本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如iOS中保证线程安全的几种方式与性能对比、iOS 常见知识点(三):Lock。本文也不会详细介绍锁的具体实现原理,这会涉及到太多相关知识,笔者不敢误人子弟。本文要做的就是简单的分析 iOS 开发中常见的几种锁如何实现,以及优缺点是什么,为什么会有性能上的差距,最终会简单的介绍锁的底层实现原理。水平有限,如果不慎有误,欢迎交流指正。同时建议读者在阅读本文以前,对 OC 中各种锁的使用方法先有大概的认.转载 2020-08-11 16:22:02 · 146 阅读 · 0 评论 -
@synchronized 递归锁详解
如果你已经使用 Objective-C 编写过任何并发程序,那么想必是见过@synchronized这货了。@synchronized结构所做的事情跟锁(NSLock, 更准确的说法应该是NSRecursiveLock)类似:它可以防止不同的线程同时执行同一段代码。但在某些情况下,相比于使用NSLock创建锁对象、加锁和解锁来说,@synchronized用着更方便,可读性更高。下面是SDWebImage中的代码, 给一个线程不安全的NSMapTable加递归锁, 保证NSMapTable的...原创 2020-08-10 16:49:18 · 13317 阅读 · 0 评论 -
用GCD构造线程安全的类
到目前为止,我们已经了解到,在多线程的程序中,数据读写访问的操作必须被某种同步机制保护着。我们使用GCD同步队列来确保这个过程。我们也讨论了如何使用并发队列实现一个读写锁。为了让这篇文章更简单易懂,这里我继续使用串行队列。一个始终存在的问题:不论是谁访问了你的数据都必须使用dispatch_sync()来确保线程安全,否则就会得到错误的结果。尤其是当你的代码被某个不熟悉你的用意的人使用时(比如,你的代码是某个框架的一部分),这个问题将尤为明显。如果我们能够将访问数据的同步操作封装起来是不是很转载 2020-07-30 15:49:15 · 631 阅读 · 1 评论 -
为什么选择GCD
Grand Central Dispatch(GCD)是OS X 10.6和iOS 4引进的一个重要的系统库,它提供了一系列C的API,方便我们在iOS和OS X上处理并发编程。GCD支持C,C++,Objective C和Swift。当你开始了解GCD的时候,你会发现2件事:它的API相当简洁,并且在它的介绍资料里没有任何难点。有一份易懂的介绍资料通过一些基本模式来指导你学习GCD,难道不是很好嘛?那就是这一系列文章要做的。我从很早就开始使用GCD了,也跳过很多坑,我希望我能引导你学习这一强大而优转载 2020-07-29 19:00:11 · 286 阅读 · 0 评论 -
GCD知识补充.目标队列+GCD循环
通常我们会用for循环遍历,但是GCD给我们提供了快速迭代的函数dispatch_apply。dispatch_apply按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束。如果是在串行队列中使用 dispatch_apply,那么就和 for 循环一样,按顺序同步执行。可这样就体现不出快速迭代的意义了。我们可以利用并发队列进行异步执行。比如说遍历 0~10 这10个数字,for 循环的做法是每次取出一个元素,逐个遍历。dispatch_apply 可以 在多个线程中同时(异步)原创 2020-07-29 18:03:35 · 1267 阅读 · 0 评论 -
ios NSTimer和GCDtimer对比
NSTimer这个大家用的比较多, _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES]; // 取消的时候 [self.timer invalidate]; self.tim...原创 2019-10-04 17:04:34 · 1428 阅读 · 0 评论 -
使用dispatch_group来进行线程同步
我的上篇文章iOS中多个网络请求的同步问题总结中用到了dispatch_group来进行线程同步,对用法不是特别熟悉所以整理这篇文章来加深记忆(闲着也是闲着)。一、简单介绍下将会用到的一些东西英语不好就不翻译官方文档了..1、dispatch_group_async* Submits a block to a dispatch queue and associates the block with the given* dispatch group//将一个block(代码块)加.转载 2020-05-27 15:25:49 · 559 阅读 · 0 评论 -
ios网易大白Crash自动防护
前言 大白(Baymax),迪士尼动画《超能陆战队》中的健康机器人,是一个体型胖胖的充气机器人,因呆萌的外表和善良的本质获得大家的喜爱,被称为“萌神”。Baymax项目是为了减少开发人员在开发中一些不规范的代码编写造成的内存泄露,界面卡顿,耗电等问题而来的一个监控系统。现在Baymax迎来了它新的功能:APP运行时Crash自动防护功能,为app的流程顺利运行保驾护航!下...转载 2020-04-06 18:25:39 · 2684 阅读 · 0 评论 -
ios Crash回光返照,日志上报
大家平时在开发过程中,经常会遇到Crash,那也是在正常不过的事,但是作为一个优秀的iOS开发人员,必将这些用户不良体验降到最低。线下Crash,我们直接可以调试,结合stack信息,不难定位! 线上Crash当然也有一些信息,毕竟苹果爸爸的产品还是做得非常不错的!通过iPhone的Crash log也可以分析一些,但是这个是需要用户配合的,因为需要用户在手机 中 设置-> 诊断...转载 2020-04-06 17:50:22 · 1532 阅读 · 0 评论 -
ios使用XXShield崩溃处理
原文地址前言正在运行的 APP 突然 Crash,是一件令人不爽的事,会流失用户,影响公司发展,所以 APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性。但是有时候 APP Crash 是应有的表现,我们不让 APPCrash 可能会导致别的逻辑错误,不过我们可以抓取到应用当前的堆栈信息并上传至相关的服务器,分析并修复这些 BUG。所以本文介绍的 X...转载 2020-04-06 17:25:07 · 780 阅读 · 0 评论 -
理解 ARC 实现原理 -- 详细总结
ARC 是 iOS 中管理引用计数的技术,帮助 iOS 实现垃圾自动回收,具体实现的原理是由编译器进行管理的,同时运行时库协助编译器辅助完成。主要涉及到 Clang (LLVM 编译器) 和 objc4 运行时库。本文主要内容由修饰符 __strong 、 __weak 、 __autorelease 拓展开,分别延伸出引用计数、弱引用表、自动释放池等实现原理。在阅读本文之前,你可以看看下面几...转载 2020-03-30 16:56:51 · 1917 阅读 · 0 评论 -
iOS runloop中的source0/source1
Source有两个版本:Source0 和 Source1。source0和source1很容易让人糊涂,为了让大家更好理解,我先阐述写其他的概念,我们知道APP运行的过程其实就是处理各种事件的过程,那么,如果让大家把事件进行分类,大家会分成几类?分类的方式有很多,但一定会有下面这种:系统层事件、应用层事件、特殊事件。(这只是为了大家理解source1和source0举得一个不严谨的例...转载 2020-03-27 17:44:33 · 10731 阅读 · 0 评论 -
iOS实时卡顿检测-RunLoop
前言在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件中那些造成性能低下的”罪魁祸首”也是我们神圣的职责。众所周知,iOS平台因为UIKit本身的特性,需要将所有的UI操作都放在主线程执行,所以也造成不少程序员都习惯将一些线程安全性不确定的逻辑,以及其它线程结束后的汇总工作等等放到了主线,所以主线程中包含的这些大量计算、I...转载 2020-03-26 18:56:43 · 1814 阅读 · 1 评论 -
iOS GCD中控制最大并发数
一、概述在GCD中有两种队列,分别是串行队列和并发队列。在串行队列中,同一时间只有一个任务在执行,不能充分利用多核 CPU 的资源,效率较低。并发队列可以分配多个线程,同时处理不同的任务;效率虽然提升了,但是多线程的并发是用时间片轮转方法实现的,线程创建、销毁、上下文切换等会消耗CPU 资源。目前iPhone的处理器是多核(2个、4个),适当的并发可以提高效率,但是无节制地并发,如将大...转载 2020-03-06 18:49:33 · 2175 阅读 · 0 评论 -
操作系统的fock和mmap
fork入门知识fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。同时,fork()函数也可以通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同...原创 2020-03-01 21:17:48 · 798 阅读 · 0 评论 -
优先级反转和优先级继承
iOS的锁中有一个自选锁OSSpinLock , 这个api被标记为不推荐 , 理由就是会产生优先级反转的问题, 当时并不是特别理解这个优先级反转 . 后来在看一本书 <算法之美> 里在讲进程调度,优先级调度算法时也提到优先级反转,打算深入了解一下.在iOS中,系统维护了5个不同的线程优先级/QoS: background,utility,default,user-init...转载 2020-02-29 14:55:40 · 3011 阅读 · 0 评论 -
ios实现读写锁,AFN的实现
读写锁场景:同一时间,只能有1个线程进行写的操作同一时间,允许有多个线程进行读的操作同一时间,不允许既有写的操作,又有读的操作上面的场景就是典型的“多读单写”,经常用于文件等数据的读写操作,iOS中的实现方案有:1、读写锁:pthread_rwlock等待锁的线程会进入休眠2、dispatch_barrier_async这个函数传入的并发队列必须是自己通...原创 2019-11-03 18:03:31 · 5305 阅读 · 0 评论 -
dispatch_once原理,自己使用锁实现单例
原文参考dispatch_once分析 在iOS开发中,我们经常使用dispatch_once去定义一个单例,来保证对象的唯一性,不过我们是否去了解过dispatch_once是如何在多线程情况下保证生成对象的唯一性呢?例如,我们经常用下面的代码块生成一个单例。+ (instancetype)sharedInstance { static XXObject *_ins...原创 2019-11-01 18:54:16 · 7479 阅读 · 2 评论 -
ios 全局监测app的帧数,cpu,内存
如果是一个做产品的公司,app的性能关系到用户体验,开发者必须关注应用性能所带来的用户流失问题。这篇文章主要是介绍一款实时监控app各项性能指标的工具,包括FPS、CPU占用率、内存使用量,可以在开发阶段及时发现卡顿,然后处理。获取FPS:这个主要就是使用了CADisplayLink ,CADisplayLink是用于同步屏幕刷新频率的计时器,当屏幕刷新的时候就会调用对应的sel,所以不需...原创 2019-10-26 13:44:30 · 4733 阅读 · 1 评论 -
ios 4种方式防护label.text = @(100)崩溃
服务器在给客户端接口的时候一般是json,正常情况下约定是NSString类型,但是有时候服务器给到就是NSNumber类型。如果是需要展示的数据,label.text = @(100),这样就会崩溃。所以下面有3种方式来防止这个崩溃。第一种方式:最推荐使用,category添加方法,然后做交换#import <UIKit/UIKit.h>@interface U...原创 2019-10-26 12:05:02 · 671 阅读 · 0 评论 -
ios中的锁
代码测试可参考,只有实际写过才能更好的理解:https://www.jianshu.com/p/6d6832e42936在平时开发中我们经常会使用多线程,多线程为我们带来了很大便利,也提高了程序的执行效率,但同时也带来数据风险:当至少有两个线程同时访问同一个变量,而且至少其中有一个是写操作时,就发生了Data race。所以这是就要利用一些同步机制来确保数据的准确性,锁就是同步机制中的一种。...转载 2019-10-22 22:39:03 · 1365 阅读 · 1 评论 -
OC对象的一生
前言在面向对象编程中,我们每天都在创建对象,用对象描述着整个世界,然而对象是如何从孕育到销毁的呢?目录1.孕育对象 2.对象的出生 3.对象的成长 4.对象的销毁 5.总结一.孕育对象每天开发我们都在alloc对象,而alloc方法做了些什么呢?+ (id)alloc { return _objc_rootAlloc(self);}所有对象all...转载 2019-01-31 14:33:00 · 758 阅读 · 0 评论 -
OC最实用的runtime总结
前言runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的,并且最后两个demo也是MJExtension的实现原理,面试的时候也可以多扯点。另外runtime的知识还有很多,想要了解更多可以看我翻译的官方文档(有点枯燥),本文的demo下载地址什么是runtime?runtime 是 OC底...原创 2016-05-27 14:51:14 · 685 阅读 · 0 评论 -
GCD 同步/异步, 串行/并发 , 几个面试题
首先,我们先来了解一下在 iOS 并发编程中非常重要的三个术语,这是我们理解 iOS 并发编程的基础: 进程(process),指的是一个正在运行中的可执行文件。每一个进程都拥有独立的虚拟内存空间和系统资源,包括端口权限等,且至少包含一个主线程和任意数量的辅助线程。另外,当一个进程的主线程退出时,这个进程就结束了; 线程(thread),指的是一个独立的代码执行路径,也就是说线程是代码...原创 2019-05-16 16:25:10 · 469 阅读 · 0 评论 -
NSObject对象占用多少内存
面试题:一个NSObject对象占用多少内存?探寻OC对象的本质,我们平时编写的Objective-C代码,底层实现其实都是C\C++代码。OC代码的转化过程OC的对象结构都是通过基础C\C++的结构体实现的。我们通过创建OC文件及对象,并将OC文件转化为C++文件来探寻OC对象的本质OC如下代码#import <Foundation/Foundation.h&g...转载 2019-01-31 12:07:18 · 920 阅读 · 0 评论 -
ios 针对数组越界的崩溃优化
数组越界是常见的崩溃 , 崩溃日记是类似这样的 :Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 22 beyond bounds for empty NSArray'网上也找过怎么解决,但是都不是太彻底,...原创 2018-05-08 16:57:36 · 2276 阅读 · 0 评论 -
iOS多线程,入门使用扫盲
在这篇文章中,整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。OK,let's roll!概述在 iOS 中其实目前有 4 套多线程方案,他们分别是:Pthreads NSThread GCD NSOperation & NSOperationQueue所以接下来,我会一一讲解这些方案的使...转载 2016-03-12 10:22:59 · 416 阅读 · 0 评论 -
我是一个线程
我是一个线程,我一出生就被编了个号: 0x3704,然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴。 我身边的同伴0x6900待的时间比较长, 他带着沧桑的口气对我说: “我们线程的宿命就是处理包裹。把包裹处理完以后还得马上回到这里,否则可能永远回不来了。” 我一脸懵懂,包裹,什么包裹? “不要着急,马上你就会明白了, 我们这里是不养闲人的转载 2016-04-14 10:34:39 · 287 阅读 · 0 评论 -
runtime 消息处理机制 -- (一)
这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制。我们将详细讨论消息的发送及消息的转发。不过在讨论消息之前,我们先来了解一下与方法相关的一些内容。基础数据类型SELSEL又叫选择器,是表示一个方法的selector的指针,其定义如下: 1 typedefstructobjc_selector*SEL; objc_s...原创 2016-03-12 10:09:04 · 445 阅读 · 0 评论 -
线上崩溃的几个原因
原文随着公司嘟嘟牛app用户数量多了起来,崩溃的问题也多了起来,最近这几天终于得空,集中时间处理了一下崩溃的问题,现总结一下,希望对大家有所帮助。杀手 NO.1:NSInvalidArgumentException 异常出现这个crash的原因有很多,选取了崩溃次数较多的crash。crash 日志1-11-[__转载 2017-01-23 13:40:36 · 3150 阅读 · 0 评论 -
OC关联objc_setAssociatedObject, 如何使用及原理
面试题Category能否添加成员变量?如果可以,如何给Category添加成员变量? 答:不能直接添加成员变量,但是可以通过runtime的方式间接实现添加成员变量的效果。 为什么Category 不能添加成员变量? 我们从分类的结构的角度来考虑一下分类中为什么不能添加成员变量: 通过分类的底层结构我们可以看到,分类中可以存放实例方法,类方法,协议,属性,但是没有存......原创 2016-05-17 14:41:29 · 4526 阅读 · 0 评论 -
一步步完成的 json或字典 转 model
前言我们在iOS开发中,一般会使用MVC或者MVVM等模式。当我们从接口中拿到数据时,我们需要把数据转成模型使用。下面我就带大家一起用runtime一步一步的来完成这个转换框架.(比较简单的model不用runtime也可以的) .git地址https://github.com/guochaoshun/RootModel1、先写一个简单的字典到模型的转换先来最简单的 , 比如服...原创 2017-02-07 09:51:22 · 3436 阅读 · 0 评论 -
runtime获得所有属性进行解档,归档,description
description在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c里使用NSLog("%@",model)这行代码打印出来的却是model的地址. 不是我们所想要的结果~! 看图:那么问题又来了?有没有办法解决这个问题尼,答案那就是有~!只需要重写- (NSS转载 2016-06-13 16:57:47 · 479 阅读 · 0 评论