他想表达的是意思是:子线程的 runloop 无法通过系统自动创建,必须有开发者手写创建并开启。
iOS面试题:一个 autorealese 对象在什么时刻释放?分两种情况:手动干预释放时机、系统自动去释放。 手动干预释放时机:手动指定 autoreleasepool 的 autorelease 对象,在当前作用域大括号结束时释放。 ...
他想表达的是意思是:子线程的 runloop 无法通过系统自动创建,必须有开发者手写创建并开启。
iOS面试题:一个 autorealese 对象在什么时刻释放?分两种情况:手动干预释放时机、系统自动去释放。 手动干预释放时机:手动指定 autoreleasepool 的 autorelease 对象,在当前作用域大括号结束时释放。 ...
第一篇文章对VIPER进行了简单的介绍,这篇文章将从VIPER的源头开始,比较现有的几种VIPER实现,对VIPER进行进一步的职责剖析,并对各种细节实现问题进行挖掘和探讨。...
还要一中是基于 Protocol 的 router,参考 ZIKRouter
iOS 组件化 —— 路由设计思路分析前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等...
target-action 提供了远程调用和本地调用为主,远程调用是将 url 方式转换成本地调用的 perfortarget
iOS 组件化 —— 路由设计思路分析前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等...
首先线程和runloop是一一对应的, 当开启线程时会伴随创建一个runloop, 但这个runloop并不会向主线程一样自动开启, 需要你执行 getCurrent 方法进行开启, 这个所谓的创建是说没法对 runloop 使用 new/alloc 方法进行创建, 子线程的runloop和主线程的runloop的最主要最作用都是为了保证线程不会退出, 让事件得以执行完成, 但是当线程需要销毁时, 对应的runloop自然也需要被释放.
iOS 多线程:『RunLoop』详尽总结本文首发于我的个人博客:「程序员充电站」[https://itcharge.cn]文章链接:「传送门」[https://itcharge.cn/ios-complete-le...
@动感超人丶 如果你有印象的话,就会发现老的 runtime和新的 runtime 中的 objc_class 结构为什么差异会那么大, 还需要一个class_rw_t 和class_ro_t 哈哈哈
iOS-分类(Category)Category是Objective-C 2.0之后添加的语言特性,分类、类别其实都是指的Category。Category的主要作用是为已经存在的类添加方法。Objecti...
静态库是编译期的时候连接的吧, 要不然编译出来的可执行文件就不能执行了.
深入理解iOS App的启动过程前言 启动时间是衡量应用品质的重要指标。 本文首先会从原理上出发,讲解iOS系统是如何启动APP的,然后从main函数之前和main函数之后俩个角度去分析如何优化启动时间。 ...
@上帝不在服务区 元类存储的是类相关的信息, 类存储的是实例对象的信息, 那么如果是类方法调用, 自然是操作元类, 而元类也是Class类型, 不知道是不是因为这个, 造成了类对象的isa指向NSArray类的笔误(没恶意)?
iOS Runtime:Class 和 meta-class1、Class Objective-C类是由Class类型来表示的,它实际是一个指向objc_class结构体的指针。它的定义如下 objc_class结构体定义如下: 在这...
交换方法的中最好要在执行自己的方法, 简单说A<->youFunc互换, youFunc中要执行[self youFunc], 这样别人在A中就可以添加操作了, 并不需要交换回来.
iOS开发·runtime原理与实践: 方法交换篇(Method Swizzling)(iOS“黑魔法”,埋点统计,禁止UI控件连续点击,防奔溃处理)本文Demo传送门:MethodSwizzlingDemo 摘要:编程,只了解原理不行,必须实战才能知道应用场景。本系列尝试阐述runtime相关理论的同时介绍一些实战场景,...
@PerryMorning 首先要弄清楚是所有的局部变量的指针都在栈区, 而值还要看这个对象的创建方式是否用到了new 或者 alloc, 绝大部分用到的都在堆区, 少部分经过编译器处理的依然还会在原来的位置. 其次要弄清楚动态分配内存的时候, 会根据系统位数以及对象的大小判断使用传统存储方式还是Tagged Pointer方式, 传统意义上来说要分清对象的值和对象的指针这两个概念, 对象的指针指向了对象的值所在的地址, 而指针也需要存储空间, 也就是说在伴随对象创建的时候, 会申请一块空间同时存储指针和值这两个东西, 而 Tagged Pointer 简单说就是把指针和值同时存储在了一个地址上, 而这个地址每一位都有自己所代表的意义, 能把它当对象使用也是因为它有对象的指针信息以及值信息, 因为它不是对象所以没有isa指针. 另外就内存分配而言, 栈地址高于堆地址.
深入理解Tagged Pointer在调试程序或者反编译App时,经常可以看到"NSTaggedPointerString"这个东西例如: 打印: 这里首先会有两个问题:1.为什么创建出来的地址分为两种?2.t...
这个地方要解释两个部分:
1. performSelect:底层调用
- performSelect: 方法底层判断了传入的 sel 是否存在, 不存在报方法不存在, 存在调用 msgSend:方法发送消息.
2. msgSend: 原理
- 发送消息是会查询当前 Class 的 methodList 中是否有与 sel 相对应的方法实现, 如果有直接执行(会忽略消息转发). 如果没有, 判断动态解析中是否新的方法实现, 如果没有才去执行 forwardingTargetForSelector: 走消息转发流程, 因此图中的 '返回YES | 返回NO', 说的并不是方法的返回值.
iOS Runtime详解Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...
Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...
name 传 @"", 你传nil不会报警告吗?
深入理解iOS NSNotificationNSNotification在平时开发中使用非常频繁。网上关于NSNotification介绍大多是停留在用法的介绍,基本上没有深入介绍NSNotification原理的文章...