说说 UIView 中 frame 和 bounds 的区别和关系

UIView 中 frame 和 bounds 的区别和关系区别首先说说区别, 根据官方描述我们知道 frame 描述了该视图与父视图之间的平面坐标和大小;bounds 描述了该视图内部可见区域的坐标和大小。 但是仅仅靠这句简单的话,很难有直观的理解,我们心中会有千万个疑问,其中一定有一个 : frame 既然表示了视图的大小和坐标,还他妈要 bounds 何用? 我们下面慢慢展开,通过简单的几行代码,一步步发现其中缘由。 二者的关系这里还要交代一下,UIView 和 CALayer 的 frame 以及 bounds 是同一个概念,UIView 是 CALayer 的代理,以及几何对等体,简单说,在 frame 和 bounds的层面,我们可以认为  UIView 和 CALayer 完全相同。暂时忽略掉 CALayer 。 frame.…

NSTimer 的强引用错在哪了?

iOS 开发新手,常常抱怨"计时器又导致内存泄露了",这时度娘很贴心的“送来”各种解决方案,解决了因循环引用导致的内存泄露问题。但作为工程师的我们,岂能就这样放过 NSTimer 呢? 首先,内存泄漏是个很严肃的问题,我相信 Apple 的工程师是不会能出这种低级错误的。 其次,作为  Apple 提出的 Target-Action 模式中,明确说明了 Target 是弱引用,类似于委托模式。 由于 ObjC 采用引用计数来管理内存,开发者对于引用关系具有敏感的洞察力是基本功。不过 Apple 官方对于 NSTimer 强引用 Target 这件事却没有明确的说明(符合苹果的一贯风格) 那么问题来了: NSTimer 对于 Target 模式是否符合苹果自身的规范?强引用 Target 发生的时机在何时?一旦发生,是否永久生效? 如果永久生效,…

"self.class" 和 "object_getClass" 为什么不同?

"self.class" 和 "object_getClass" 为什么不同最近看到很多人对 "self.class" 的解释是,"如果是实例的时候,返回类对象,否则返回自身。" 这种说法,含糊不清,缺少背景上下文,也经不起推敲。这个类对象是什么?这个否则返回自身的情况又是如何? Objective-C 的面向对象首先我们简单了解一下,在 Objective-C 中,所有的实例对象都通过实现对应的类来完成,类对象为实例推向提供了实例方法,实例属性的模板,可以说类是对象的模板。 那么又是什么来描述类对象呢? 元类。 Objective-C 通过元类来描述类对象,元类其实和类一样,只是用途不同,可以通过 class_isMetaClass() 来判断是否为元类。元类中存储了类方法的信息,元类是类的模板。 Objective-C 中,实例,类,元类,都是对象,都是结构体的形式存在,在逻辑上分别代表了 OOP 中的不同层级。 object_…

源码解析 objc_msgSend 消息发送

源码解析 objc_msgSend 消息发送objc_msgSend从 objc-msg-arm64.s 汇编文件中找到 objc_msgSend 的汇编实现,我们可以看到 objc_msgSend 的汇编符号 _objc_msgSend #define NORMAL 0 #define GETIMP 1 #define LOOKUP 2 ENTRY _objc_msgSend UNWIND _objc_msgSend, NoFrame cmp p0, #0 // nil check and tagged pointer check #if SUPPORT_TAGGED_POINTERS b.le LNilOrTagged // (MSB…