自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (3)
  • 收藏
  • 关注

原创 随笔 利用GCD资源调用实现定时器

dispatch_source_t 资源调用如下几个方法dispatch_source_create 创建一个资源调用对象dispatch_source_set_timer 设置定时器的参数dispatch_source_set_event_handler 设置定时器的事件处理dispatch_active 启动定时器dispatch_source_cancel 取消定时器实现方式- (void)gcd_timer{ __block int countDo

2020-10-30 11:19:05 600

原创 需求:如何解决多线程编程时,不可避免地会发生多个线程使用同一个资源的场景

dispatch_semaphore_t GCD的锁机制,是自旋锁,持有计数的信号dispatch_semaphore_create 创建信号量dispatch_semaphore_wait 信号量-1,-1之后小于0时,线程阻塞,并以FIFO方式等待资源dispatch_semaphore_signal 信号量+1,+1之后大于0时,并以FIFO的方式唤醒等待的线程实现代码- (void)group_display11 { /// 创建一个调度组 dispa

2020-10-30 10:44:46 232

原创 需求:分别异步执行几个耗时任务,然后当几个耗时任务都执行完毕后再回到主线程执行任务。

dispatch_group_tdispatch_group 会在整个组的任务全部完成时通知开发者,这些任务可以同步也可以异步,甚至不同队列。需要搭配几个关键函数dispatch_group_enter(group); 进入该组dispatch_group_leave(group);离开改组dispatch_group_notify 组内任务都完成通知给主线程进行刷新UI等操作- (void)group_display_action{ //创建一个调度组

2020-10-30 09:44:54 357

原创 需求:异步执行两组任务,但第二组任务需要第一组完成之后才能执行。

dispatch_barrier_async 可以提供一个'栅栏'将两组异步执行的任务分隔开,保证先于栅栏的方法提交到队列的任务全部执行完成之后,开放栅栏,将栅栏之后的任务组调到队列中执行。示例代码- (void)barrier_display{ NSLog(@"当前线程------%@",[NSThread currentThread]); dispatch_queue_t theConcurrentQueue = dispatch_queue_create(

2020-10-30 09:11:19 245

原创 需求: 遍历一个很大很大的集合,使用 for 循环将会花费很多很多时间。

dispatch_apply 按照指定的次数将指定的任务提交到指定队列中,同步执行并等待所有任务完成后return线程上下文:dispatch_thread_context_t dtctxt基层嵌套:size_t nested = dtctxt ? dtctxt->dtc_apply_nesting : 0;当前线程dispatch_queue_t old_dq = _dispatch_queue_get_current();源码:voiddispatch_apply_f(s.

2020-10-29 23:06:52 220

原创 需求:单例模式。

dispatch_once允许开发者在线程安全的执行且只有一次指定任务使用代码+ (QDispatchQueue *)hightGlobalQueue{ static QDispatchQueue *queue; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ queue = [[QDispatchQueue alloc] initWithQueue:dispatc...

2020-10-29 22:12:49 135

原创 需求:延后一段时间再执行

有三种方案001 NSTimer 需要依赖于指定runloop的运行模式002 NSObject.performSelector:withObject:afterDelay: 依赖runloop003 dispatch_after 不依赖Runloop- (void)testDispatchAfter{ NSLog(@"start----%s----",__func__); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (...

2020-10-29 21:44:20 275

原创 GCD封装实现最大并发数

//// QDispatchQueue.h// GCDPropertyQueue//// Created by maochengfang on 2020/10/28.//#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface QDispatchQueue : NSObject+ (QDispatchQueue *)mainThreadQueue;+ ...

2020-10-28 23:09:54 343

原创 阅读 SDWebImage

[imgBtn sd_setImageWithURL:[NSURL URLWithString:item[@"url"]] forState:UIControlStateNormal];死磕 sd_setImageWithURL方法核心方法是- (id <SDWebImageOperation>)loadImageWithURL:(nullable NSURL *)url options:(SDWebImag...

2020-10-28 11:00:13 53

原创 阅读 AFNetWorking

AFHTTPSessionManager继承AFURLSessionManager继承很多代理例如NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate,等AFURLSessionManager 有几个属性很关键NSURLSession *session;NSOperationQueue *operationQueue现在要使用AFHTTPSes.

2020-10-28 10:02:38 89

原创 IOS某外派岗位面试

前言:考核基础有没有盲区,是否有意识写出正确代码001 循环引用的原因,它会造成怎样的后果以及如何避免?循环引用的原因是对象在作用域结束后无法回收,会造成内存泄漏。1.NSTimer 在创建的时候会默认对当前self有个强引用,这里可以用一个weakself对象进行持有,在dealloc方法中,一定要先使用[self.timer invalidate];然后将timer=nil;timerWithTimeInterval创建的timer需要手动添加到runloop中,而scheduled

2020-10-26 23:15:11 196

原创 IOS -- __strong __weak __unsafe_unretained alloc 修饰对象

001__strong该对象在作用域内不会被销毁,只有在方法完成后被回收002__weak对象分配在方法内且一个__weak指针指向这段内存,所以引用计数0,会被回收,甚至在下一个语句之前。003__unsafe_unretained对象分配在方法内,对象会被立即释放,但是不回收,再次引用会坏内存访问这是存放在栈区栈区是由系统管理004 alloc对象分配在方法内,对象会被立即释放,但是不回收,再次引用会坏内存访问这是存放在栈区栈区是由系统管理0...

2020-10-26 16:25:32 131

原创 IOS----runtime class

看源码struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; // formerly cache pointer and vtable class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags class_rw_t *data() const {...

2020-10-25 18:59:05 150

原创 iOS--内存管理 Tagged Pointer

Tagged Pointer从64位开始iOS引入了Tagged Pointer技术,用于优化NSNumber NSDate NSString等小对象的存储,节省内存空间在没有引入该技术之前,NSNumber等对象要分配内存,维护引用计数等,NSNumber指针存储的是堆中的NSNumber对象的地址,需要一个栈和一个堆的空间 开销很大,但是我只是存储一个整形用不着这么多空间。使用tagged pointer之后,NSNumber指针存书的数据就变成Tag+Data,也就是说是将数据直接存储在指

2020-10-25 12:28:57 240

原创 随笔-----TCP&&UPD笔记

一、TCP (传输控制协议)001 TCP 提供一种面向链接 可靠的字节流服务002 TCP 仅有两方进行通信002 TCP使用校验 确认重传机制003 TCP给数据分节进行排序,并使用累积确认保证数据顺序不变和不重复004 TCP使用滑动窗口机制来实现流量管控。通过动态改变窗口的大小进行拥塞控制二、UDP(用户数据报协议)001 缺乏可靠,本身不提供确认 序列号,超时重传机制002 UDP是有长度的,发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既

2020-10-25 10:46:31 119

原创 随笔--iOS load initialize

一、为何源类+load先执行 源类分类没有覆盖+load方法?那得看源码了看objc-os中的_objc_init方法中void _objc_init(void){ static bool initialized = false; if (initialized) return; initialized = true; // fixme defer initialization until an objc-using image is foun...

2020-10-24 23:38:01 95

原创 随笔 iOS之对象内存分布

当我们继承NSObject类 新建一个对象,会在内存中开辟一个数据结构Name_IMP{Class isa;_par,_par,}。里面存放一个isa指针,成员变量;但是不包含方法。为何不包含方法呢?方法存放到哪里呢?一个类我可以创建多个实例对象,每个对象是属性是特有的,但是方法是都是一样的,如果每次都增加内存来存放方法,这样会占据很大空间,其实方法是放在类中的在instance的isa指向class,当调用对象方法时,通过instance的isa指针找到class,最后找到对象的方

2020-10-24 21:51:23 461

原创 随笔---iOS category和class extension

001 category 使用场景拆解很多模块category编译之后的底层数据结构是struct category_t,里面存储分类对象的方法,类方法,属性,协议等信息,在程序运行的时候,runtime会讲category的数据合并到类信息中category中的方法是依照编译顺序进行访问的。002category和extension的区别class extension 在编译的时候,它的数据就已经包含到类信息中;category是在运行时,才会将数据合并到类信息中class e..

2020-10-24 20:56:31 102

原创 IOS --runtime 学习笔记

一、 +(void)initialize001 在接收到第一个消息之前初始化该类。个人理解是该类内部发出第一条消息之前就会调用,那么第一条消息理解呢?alloc方法调用。002 运行时initialize以线程安全的方式将消息发送给该类,提到线程安全 就会想到锁的作用,因为以线程安全方式发送消息,那么其他任何尝试给类发送消息的线程都会被阻塞,直到initialize执行完毕。003 如果子类不实现initialize,则任何超类可以实现多次调用(运行时将调用继承的实现),或者子类显式调用[s

2020-10-24 10:57:45 258

原创 随笔---iOS copy && strong

最近面试提到过copy和strong 这里自己写demo来巩固基础浅拷贝:对内存地址的复制,让目标对象指针和源对象指向同一片内存空间深拷贝:让目标对象指针和源对象指针指向亮片相同内容的内存空间@interface ViewController ()@property (nonatomic,strong) NSString *strongStr;@property (nonatomic, copy) NSString *copyyStr;@property (nonatomic,..

2020-10-24 01:19:08 194

原创 随笔 iOS动态解析和消息转发实现和源码分析

当一个对象调用一个方法,会在底层调用objc_msgSend()方法,如通过isa指针指向类们在方法缓存中查找,如果方法是有序的那么通过二分查找进行,未排序那就一般遍历查询。如果类中找不到会在父类中查找直到元类中;如果这里都没法找到,那就进行消息转发;消息转发我的理解是,尽最大努力让该方法有target接盘执行。001 看是否能接受该SELresolveInstanceMethod&&resolveClassMethod如果可以接受该SEL那么就将该方法转移到在该类中某方法如

2020-10-22 11:40:15 179

原创 随笔 --- IOS网络请求断点续传

iOS 中如何实现断点续传的功能思路:001 该类继承NSURLSessionDataDelegate代理002 每次请求的时候都到本地缓存获取对应的数据流大小 然后更新self.currentSize003对NSMutableURLRequest 的forHTTPHeaderField:进行处理 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设...

2020-10-21 23:59:01 752

CommonWebView的副本.zip

OC与H5自定义交互H5控件

2021-04-29

RunLoop-线程保活.zip

保持线程活demo 利用runloop 机制休眠机制来 来保持线程活跃 并且开发者可以自己控制线程dealloc

2020-03-04

如何学习算法 五毒神掌 让算法改变自己的人生

LeetCode刷题 如何学习算法 五毒神掌 让算法改变自己的人生

2020-02-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除