首页
首页
沸点
课程
直播
活动
竞赛
商城
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
iOS
Samcooke
创建于2021-06-30
订阅专栏
学习iOS
暂无订阅
共26篇文章
创建于2021-06-30
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
性能优化
卡顿优化原理,优化。CPU GPU优化,离屏渲染,卡顿检测,耗电主要来源,耗电优化,APP启动优化,安装包瘦身
Xcode一个项目中建立多个工程
Xcode一个项目中建立多个工程.在一个Xcode的界面中同时管理多个工程。先建立一个工作空间,再以两种不同的方式添加Project.
多线程(二)、线程安全
目前已经不再安全,可能会出现优先级反转问题。 如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁。 每个线程访问的锁必须是同一把锁。线程1进来访问这把锁,发现没有加锁,然后加锁-->处理业务-->解锁,这时线程2进来访问这把锁,发现已加锁,就处于忙…
多线程(一)、GCD
NSThread、GCD、NSOpration都是对pthread进行封装。 同步:发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。 异步:调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。 串行:排队执行。Serial interview…
Runloop(三)、Runloop应用
会发现,当滚动TextView时,定时器停止滚动。 scheduled安排。scheduledTimer开头的,这种定时器安排好了,会将NSTimer对象添加到默认模式下工作。滚动的时候切换到其他模式了,退出默认模式了,所以会停止滚动。 如果传的参数是NSRunLoopComm…
Runloop(二)、源码
Runloop很多API,最终会调一些很长的函数。比如__CFRunLoopDoObservers最终会调如下图: GCD不依赖Runloop,GCD很多操作自己处理,只不过有些情况会交给Runloop处理。如下:
Runloop(一) 基本概念
Runloop保存在一个全局的Dictionary里,线程作为key,Runloop作为value. 主线程的Runloop已经自动获取(创建),子线程默认没有开启Runloop。 CFRunLoopGetCurrent()和[NSRunLoop currentRunLoop]…
Runtime(七)、runtime应用
object_setIvar(person, ageIvar, (__bridge id)(void *)10); 这个方法传的值,必须是OC类型。当成员变量是基本类型时,比如这里是int类型,不能是NSNumber类型@(10),必须用 void *并桥接成OC类型。不能用i…
Runtime(七)、runtime应用
object_setIvar(person, ageIvar, (__bridge id)(void *)10); 这个方法传的值,必须是OC类型。当成员变量是基本类型时,比如这里是int类型,不能是NSNumber类型@(10),必须用 void *并桥接成OC类型。不能用i…
推送
环信推送,当App被杀死走APNS远程推送,当App在后台活跃或者App在前台,走的是长链接。 环信推送,类似微信。本质上还是聊天。无法像极光那样,给所有设备发送。极光推送,不管是App被杀死,还是App在前台或者后台都能实现远程推送。 本质上是发消息,只有登录才能收到。极光可…
Runtime(六). superClass的本质
把这个MJStudent.m 转化为 cpp. 可知(搜索MJStudent_run) 调objc_msgSendSuper.第一个参数为一个结构体,结构体第一成员是接收者,第二个成员是父类类对象。 所以 [super class] 打印结果是 MJStudent; [supe…
property,synthesize,dynamic
property做的事情。 生成 @synthesize age = _age. 注意:只生成setter,getter方法的声明,成员变量也不生成。
NSInvocation的使用
再一种就是 NSInvocation。 第一种方式比较简单,能完成简单的调用。 但是对于 >2 个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作。
Runtime(五).消息转发
搜__objc_forward_handler,搜不到。猜测应该是C方法。搜_objc_forward_handler.搜到后无法再进行下去,因为到此后就不是开源的了。 首先会调用forwardingTargetForSelector方法,如果实现了该方法,且返回值不为空的话,…
Runtime(四).动态解析
类对象会调用[cls resolveInstanceMethod:sel],元类对象调用[nonMetaClass resolveClassMethod:sel],然后把这个方法实现,放入class_rw_t的mthods里,注意不是放缓存(除非手动调用),是放方法二维数组里。
Runtime(三). 消息发送
objc_msgSend的执行流程可以分为3大阶段。 本节内容主要讲消息发送。 搜索objc_msgSend. 找到:objc-msg-arm64.s receiver不为nil,进入CacheLookUp(传参数NORMAL),查找缓存。如果找到CacheHit,call o…
Runtime(二) isa
has_assoc是否是设置过关联对象,而不是此时是否有关联对象。如果设置过,即使取消了,那么也算设置过。weakly_referenced 同理。 类的初始信息,不包含分类信息。 最开始是没有rw的,运行的时候才创建rw,把ro的内容和分类的信息放在rw里。 其他:C语言的字…
Runtime(一)、位域
要想学习Runtime,首先要了解它底层的一些常用数据结构,比如isa指针 在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址。
值传递,指针传递与引用传递
本篇文章均为本人理解,可能有误。 引用是C++的概念,引用就是别名。 区分技巧:在分析上面代码时,可以从变量标识符开始从右往左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。 标识符a的左边紧邻的是&,证明a是一个引用变量,而再往左是*,可见a是一个指针…
block
1. block的本质 可见block就是一个指针地址(带*),本质上是__main_block_impl_0结构体,传减去一个方法__main_block_func_0(block的函数体)和__main_block_desc_0_DATA(描述信息包括block的长度等)的…
下一页