![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS底层
文章平均质量分 73
M316625387
这个作者很懒,什么都没留下…
展开
-
RunLoop 三: 执行流程图
一、 回顾 添加 Observer 监听 RunLoop 的所有状态添加 Observer 可以监听到 RunLoop 的各种状态kCFRunLoopEntry: 进入 RunLoop 循环kCFRunLoopBeforeTimers: 处理 定时器(Timers)kCFRunLoopBeforeSources: 处理 SourceskCFRunLoopBeforeW...翻译 2018-10-18 11:55:49 · 943 阅读 · 0 评论 -
GCD 定时器
比 NSTimer 定时器 更加准时例子:// 队列,主队列,将来 的回调放在哪个队列中dispatch_queue_t queue = dispatch_get_main_queue();// 创建定时器dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);...原创 2018-11-20 15:42:25 · 757 阅读 · 0 评论 -
atomic 和 nonatomic
一、atomic 一些解释atomic 在 Mac 上经常使用,在 iOS 中不经常使用。atom :原子atomic : 原子性它并不能保证使用属性的过程是线程安全的它只能保证 set 方法 和 get 方法内部 是线程安全的。但是当 你使用属性。给属性 添加一些 内容的时候。就不能保证是线程安全的。比如说 NSArray 对象,给 [NSArray addObject] 这样就不...原创 2018-11-16 10:42:52 · 436 阅读 · 0 评论 -
IO操作
IO 操作 :又叫 文件操作文件操作分为:从文件中读取内容,例如:视频文件,mp3 文件,文本文件。往文件中写入内容。危险的文件操作是:线程A 从文件中读取内容的同时,线程B 往文件中写入内容。也就是同一时间段即读取文件,又写入文件。这样的操作是 要杜绝的。...转载 2018-11-19 10:53:54 · 689 阅读 · 0 评论 -
多线程六:dispatch_semaphore
一、定义semaphore叫做”信号量”信号量的初始值,可以用来控制线程并发访问的最大数量比如想要有3个线程同时执行任务,信号量的初始值就写3.信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步代码:例子:// 线程10、7、6、9、8- (void)test{ // 如果信号量的值 > 0,就让信号量的值减1,然后继续往下执行代码 ...原创 2018-11-15 09:44:00 · 233 阅读 · 0 评论 -
内存讲解:数据段、堆、栈
一、iOS 程序的内存布局从低到高保留代码段(__Text)数据段(__ Data)字符串常量已初始化数据未初始化数据堆(heap):比栈的内存地址小,比数据段的内存地址大栈(stack):内存地址比较大内核区一般只使用 代码段、数据段、堆、栈代码段:编译之后的代码...原创 2018-11-22 20:11:09 · 2807 阅读 · 0 评论 -
内存管理:CADisplayLink、NSTimer、NSProxy 使用注意
CADisplayLink、NSTimer 会对target 产生强引用,如果target 又对他们产生了强引用,那么就会引发循环引用。总结:CADisplayLink 想要返回界面就销毁定时器,可以使用 一个 中间代理NSTimer 则可以使用 block 和 中间代理中间代理 可以使用继承至 NSObject 或 NSProxyNSProxy 是什么?继承至 NSObjec...原创 2018-11-20 09:54:30 · 399 阅读 · 0 评论 -
NSProxy 一些 使用
一、内容NSProxy 是什么?消息转发机制NSProxy 和 NSObject 的比较解决 CADisplayLink ,NSTimer强引用target引起的无法释放问题。二、NSProxy 含义NSProxy 是跟 NSObject 一样的基类,都遵守<NSObject>协议NSProxy是一个抽象类,必须继承实例化其子类才能使用。NSProxy从类名来看...原创 2018-11-20 10:22:19 · 757 阅读 · 0 评论 -
Tagged Pointer 含义的解释
一、含义iOS 是在 64bit 开始,引入的 Tagged Pointer 技术用于优化 NSNumber、NSDate、NSString 等 小对象 的存储比如: 小型的 OC 对象,就可能用 Tagged Pointer 来实现在没有使用之前,NSNumber 等对象就是一个普通的OC 对象。需要动态分配内存、维护引用计数等,NSNumber 指针存储的是堆中 NSNumb...原创 2018-12-10 20:48:36 · 332 阅读 · 0 评论 -
Tagged Pointer 用在 NSString 上
思考以下2段代码发生了什么事情?有什么区别?/// 数据少- (void)getDispatchAsyncLess { // 全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0 ); for (int i = 0; i &amp;lt; 1000; i++) { // 异步任务 ...原创 2018-12-11 21:26:29 · 449 阅读 · 0 评论 -
NSString + Copy
拷贝目的: 产生一个副本对象比如桌面上有一个文件夹iOS,iOS文件夹中有一个名字叫做 iOS底层笔记二.docx的文件 .command + C, command + V . 会有一个 iOS底层笔记二的副本.docx 的文件。这两个文件,我可以任意改变其中的一个文件,另一个文件不会受到影响。特点:跟原对象互不影响修改原对象,不会影响副本对象修改副本对象,...原创 2019-02-09 15:42:20 · 407 阅读 · 0 评论 -
NSArray | NSDictionary + Copy
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"a",@"b", nil]; // 浅拷贝 NSArray *arr2 = [arr1 copy]; // 深拷贝 NSMutableArray *arr3 = [arr1 mutableCopy]; ...原创 2019-02-09 19:06:34 · 231 阅读 · 0 评论 -
property使用属性 copy
@property (nonatomic, copy) NSArray *data;当使用copy 的时候,set方法里面是:- (void)setData:(NSArray *)data { if (_data != data) { [_data release]; _data = [data copy]; }}// 因为 set方法中 ...原创 2019-02-09 19:34:22 · 618 阅读 · 0 评论 -
self、super 和 class、superclass 的组合
一、创建类Person 类:继承至 NSObject 类SubPerson 类:继承至 Person 类Person 类中有一个对象方法 testSubPerson类中实现此方法,并在此方法中写[self class][self superclass][super class][super superclass]外界调用 subPerson 的 test 方法。代码如...原创 2019-02-28 06:46:11 · 396 阅读 · 0 评论 -
多线程五:dispatch_Queue
直接使用GCD的串行队列,也是可以实现线程同步的代码:@interface SerialQueueDemo()@property (strong, nonatomic) dispatch_queue_t ticketQueue;@property (strong, nonatomic) dispatch_queue_t moneyQueue;@end@implementation ...转载 2018-11-14 16:15:32 · 202 阅读 · 0 评论 -
多线程六——加锁方案四:NSLock || NSRecursiveLock || NSCondition
一、NSLockNSLock 是对 pthread_mutex 普通锁的封装。遵守 NSLocking 协议它的两个方法- (BOOL)tryLock;- (BOOL)lockBeforeDate:(NSDate *)limit;(BOOL)lockBeforeDate:(NSDate *)limit;传入一个时间,在这个时间之前如果能等到这把锁放开的话,就给这把锁加锁...转载 2018-11-14 13:54:18 · 1006 阅读 · 0 评论 -
RunLoop 四: RunLoop源码学习
一、前言因为RunLoop的源码涉及到C语言,所以比较抽象。在苹果网站上下载 RunLoop 的源码,地址为:https://opensource.apple.com/tarballs/CF/找到 CFRunLoop.c 文件,进行学习。需要找到RunLoop 的入口文件,也就是上个笔记上写的 ‘通知Observers:进入Loop’ 这句话。二、如何找到 RunLoop 的入口...翻译 2018-10-19 11:06:30 · 375 阅读 · 0 评论 -
RunLoop五:在实际开发中的应用
一、在实际开发中的应用控制线程生命周期(线程保活)解决NSTimer在滑动时停止工作的问题监控应用卡顿性能优化二、控制线程生命周期(线程保活)在项目中会遇到创建一个子线程去做一些事情。为什么要创建一个子线程去做事情?因为如果把所有的事情都放在主线程中去做,就会阻塞住组线程。导致APP 看起来很卡。这个时候就可以开启一个子线程,把耗时的操作放到子线程中。这样就不会阻塞主线程,APP ...翻译 2018-10-22 13:40:01 · 539 阅读 · 0 评论 -
RunLoop 二 runLoopMode 的四种消息
一、回答问题runLoop切换 Mode 时,程序是否会退出?答:不会退出。解释:切换模式不会导致程序退出。刚才 CFRunLoopModeRef 中的定义:“如果需要切换Mode,只能退出当前Loop,在重新选择一个Mode进入。”这句话是说:“退出当前循环的代码,重新进入”。 相当于:切换 mode 是在 这两句代码里面做的。代码为:切换mode 并不会导致 while (...翻译 2018-10-17 17:07:19 · 1467 阅读 · 0 评论 -
RunLoop六:在实际开发中的应用 之 控制线程生命周期(线程保活) 二
八、 停止 NSRunLoop 运行上面提到 ,只有控制器释放了。线程没有被释放。这是因为 代码 卡在了 [[NSRunLoop currentRunLoop] run];这句代码.任务执行完成后,线程会销毁。但是 有 run 方法的话。代表系统一直在执行run 方法。所以任务并没有执行完成 。也就是任务没有执行结束,self.thread 线程并不会销毁。[[NSRunLoo...翻译 2018-10-25 15:29:02 · 554 阅读 · 0 评论 -
RunLoop六:在实际开发中的应用 之 控制线程生命周期(线程保活)
一、前言OC 的程序员大多数用过的 AFNetwork 这个网络请求框架。这个框架中就使用了 RunLoop 技术,去控制子线程的生命周期。相当于 它创建了一个子线程,这个子线程会一直都在内存中,不会死亡。当某个时间段需要子线程工作时,会告诉子线程需要做什么?过一段时间,又有工作了就又会告诉子线程需要做什么? AFNetwork 这个框架会一直让子线程 停留在 内存中。这种情况适用于: 经常...翻译 2018-10-23 11:28:08 · 381 阅读 · 0 评论 -
08 - 多线程 - 03:performSelector:withObject:afterDelay:方法
一、方法的含义 [self performSelector:@selector(test) withObject:nil afterDelay:3.0];含义:三秒以后,调用 self的 test 方法afterDelay 后面 可以写 “.0” :表示 0秒以后执行 self的 test 方法二、performSelector:withObject:afterDelay: ...原创 2018-11-06 15:06:34 · 846 阅读 · 0 评论 -
多线程三: NSThread 面试题
- (void)viewDidLoad { [super viewDidLoad]; NSThread *thread = [[NSThread alloc] initWithBlock:^{ NSLog(@"1"); }]; [thread start]; [self performSelector:@selector(test) o...原创 2018-11-07 10:23:36 · 761 阅读 · 0 评论 -
多线程四:使用GCD 实现队列组
面试题:如何用gcd实现以下功能异步并发执行任务1、任务2等任务1、任务2都执行完毕后,再回到主线程执行任务3解答:*异步并发执行任务1、任务2:* 也就是 任务1、任务2 实在子线程中执行的。* 这两个任务 是同时执行的使用队列组 来实现- (void)getGCDQueueFirst { // 创建组 dispatch_group_t group = ...原创 2018-11-07 11:38:51 · 385 阅读 · 1 评论 -
08 - 多线程 - 02 :GCD问题:队列 + 任务 是否等于 死锁
问题一:GCD 线程保活功能GCD 没有线程保活功能。线程保活功能 只能通过 runloop 来执行。GCD 只是在block 中执行代码,在block 中开启runloop。GCD 和 runloop 不是同一回事。GCD 只负责开启线程,然后去执行任务。不负责线程保活。就算 GCD 的线程活下来了,也是因为 GCD里面用了 runloop。...原创 2018-11-05 09:29:14 · 509 阅读 · 0 评论 -
08 - 多线程 - 01 :基础内容
一、iOS中的常见多线程方案iOS 中 常见的多线程 方案pthread 和 NSThread 是 程序员自己创建 线程,自己管理什么时候开启,什么时候结束。GCD 和 NSOperation 则不用程序员自己管理,是系统管理。NSThread 、 GCD 和 NSOperation 的底层使用的是 pthread。 他们都是包装的 pthread。面试题:iOS的多线程方案...原创 2018-11-05 14:41:39 · 203 阅读 · 0 评论 -
多线程六——加锁方案三 :pthread_mutex
一、定义mutex叫做”互斥锁”,等待锁的线程会处于休眠状态需要导入头文件#import &amp;lt;pthread.h&amp;gt;原创 2018-11-13 16:49:15 · 1165 阅读 · 0 评论 -
多线程六——加锁方案一 : OSSpinLock
一、iOS 中的线程同步方案 -&amp;amp;amp;gt; 加锁OSSpinLock:自旋锁os_unfair_lockpthread_mutexdispatch_semaphoredispatch_queue(DISPATCH_QUEUE_SERIAL)NSLockNSRecursiveLockNSConditionNSConditionLock@synchronized二、OSSp...原创 2018-11-08 14:04:57 · 791 阅读 · 0 评论 -
多线程六——加锁方案二 :os_unfair_lock
一、定义os_unfair_lock用于取代不安全的OSSpinLock ,从iOS10开始才支持从底层调用看,等待os_unfair_lock锁的线程会处于休眠状态,并非忙等需要导入头文件#import <os/lock.h>编写代码:死锁:永远拿不到锁只加锁,不解锁 = 死锁...原创 2018-11-12 10:20:29 · 2256 阅读 · 0 评论 -
多线程七:线程同步 - @synchronized
一、定义@synchronized是对mutex递归锁的封装@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁、解锁操作@synchronized 没有智能提示,因为苹果不推荐使用。注: 源码查看:objc4中的objc-sync.mm文件二、断点看 底层 @synchronized([self class]) { // objc_sync_ent...原创 2019-04-23 15:24:40 · 219 阅读 · 0 评论