创建ConstraintViewDSL

调用UIViewsnp 方法,生成一个ConstraintViewDSL
注意这个生成的ConstraintViewDSL持有UIView

创建ConstraintMaker

调用makeConstraints,调用ConstraintMaker对应的静态方法。
在方法的实现中,创建一个ConstraintMaker
注意这个ConstraintMaker,持有UIView

internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {let maker = ConstraintMaker(item: item)closure(maker)var constraints: [Constraint] = []for description in maker.descriptions {guard let constraint = description.constraint else {continue}constraints.append(constraint)}return constraints
}

调用闭包中的方法,生成ConstraintMakerRelatable

在调用snp.left 等方法时,会调用makeExtendableWithAttributes()生成 ConstraintMakerExtendable 实例。

public var left: ConstraintMakerExtendable {return self.makeExtendableWithAttributes(.left)
}

makeExtendableWithAttributes() 方法中,会生成ConstraintDescription,并被加到ConstraintMaker的一个数组中。

internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {let description = ConstraintDescription(item: self.item, attributes: attributes)self.descriptions.append(description)return ConstraintMakerExtendable(description)
}

ConstraintMakerRelatable中,完善约束的属性信息

ConstraintMakerExtendableConstraintMakerRelatable的子类。
这两个类要提供的信息是哪个View的什么属性要和哪个View的什么属性产生联系

public class ConstraintMakerExtendable: ConstraintMakerRelatable {// 完善from 的属性信息public var left: ConstraintMakerExtendable {self.description.attributes += .leftreturn self}...
}public class ConstraintMakerRelatable {internal func relatedTo(_ other: ConstraintRelatableTarget, relation: ConstraintRelation, file: String, line: UInt) -> ConstraintMakerEditable {...let editable = ConstraintMakerEditable(self.description)editable.description.sourceLocation = (file, line)// 约束信息的目标对象editable.description.relation = relationeditable.description.related = relatededitable.description.constant = constant}
}

ConstraintMakerFinalizable类中,完善约束细节

ConstraintMakerEditable->ConstraintMakerPriortizable->ConstraintMakerFinalizable
这三个类分别细化约束的具体数值、优先级、标签。

public class ConstraintMakerFinalizable {...public var constraint: Constraint {return self.description.constraint!}...
}

可以通过constraint方法,生成真实需要的约束。

内存问题

上面提到的类,都是生成约束过程中用到的,生成约束以后,就都销毁了。
生成的约束,被UIView持有,最终在内存中的,也只有Constraint这个属性以及它持有的其他属性。

Constraint 被 UIView 持有

可以看到Constraint被加在了一个Set中,

而这个Set是约束被加到UIView中时,第一次取Set时,被初始化的。

Constraint 持有 ConstraintItem

fromto属性

ConstraintItem 通过weak持有 UIView

public final class ConstraintItem {internal weak var target: AnyObject?internal let attributes: ConstraintAttributes
}

通过打印,也可以看到这一点。

(lldb) po blueView
<UIView: 0x7fe47bf998b0; frame = (0 0; 0 0); layer = <CALayer: 0x7fe47bf96fb0>>(lldb) po blueView.constraintsa.first!.from.target
▿ Optional<AnyObject>- some : <UIView: 0x7fe47bf998b0; frame = (0 0; 0 0); layer = <CALayer: 0x7fe47bf96fb0>>

参考

  • 读 SnapKit 和 Masonry 自动布局框架源码

转载于:https://www.cnblogs.com/huahuahu/p/SnapKit-yue-shu-chuang-jian-guo-cheng.html

SnapKit 约束创建过程相关推荐

  1. Oracle 唯一 索引 约束 创建 删除

    http://www.blogjava.net/lukangping/articles/340683.html/*给创建bitmap index分配的内存空间参数,以加速建索引*/ show para ...

  2. Oracle 创建视图、修改表的约束 创建级联删除触发器、存储过程

    1.创建视图 创建航班表的视图,用于查询航班表的所有信息 create or replace view F_view as select * from Flight; 创建机票表的视图,用于查询机票表 ...

  3. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  4. iOS 的本地化使用和创建过程

    在使用本地化语言之前,来看看本地化语言文件内容的结构(这里我以Chinese为例): "Cancel"="取消"; "OK"="确 ...

  5. python不能创建新变量_Python之变量的创建过程!

    Python之变量的创建过程 一.变量创建过程 首先,当我们定义了一个变量name = 'Kwan'的时候,在内存中其实是做了这样一件事: 程序开辟了一块内存空间,将'Kwan'存储进去,再让变量名n ...

  6. 深入浅出Spring Security(二):FilterChainProxy的创建过程

    上篇回顾 框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain,类型是FilterChainProxy WebSecurity和HttpSecurity都是建造者 ...

  7. OpenStack虚机网卡的创建过程

    OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机.虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡.虚机的创建和管理是Nova的任 ...

  8. 深入理解WMS(一):Window的创建过程

    8.3 Window的创建过程 View是Android中的视图的呈现方式,但是View不能单独存在,它必须附着在Window这个抽象的概念上面,因此有视图的地方就有Window.Android中可以 ...

  9. Android10.0应用进程创建过程以及Zygote的fork流程-[Android取经之路]

    摘要:点击手机桌面图标,例如微信,它是如何启动的呢,让我们从系统源码级来一起分析. 阅读本文大约需要花费1小时. 文章的内容主要还是从源码进行分析,虽然又臭又长,但是如果想要学习Android系统源码 ...

最新文章

  1. vs 2012自带打包工具进行部署安装
  2. 表格合并行_Word制作验收单表格,很简单,快来学习吧
  3. String str =new String(“abc“)和 String str = “abc“的比较
  4. Flex页面跳转的五种实现方式
  5. python巡检脚本juniper_JUNIPER设备日常维护巡检命令
  6. java学习(50):子类继承会优先调用父类的构造器
  7. go语言学习初探(二)基础语法
  8. 三级哪个不用学c语言,考全国计算机等级考试三级如何学C语言
  9. 【Java 强化】单元测试(JUnit3、JUnit4)、XML(语法、约束、文档结构)、DOM、DOM4J
  10. Vue之表单rules
  11. linux 文件上传扫描_SecureCRT实现windows与linux文件上传下载
  12. Red Hat TimesTen安装记录
  13. 函数执行的作用域问题
  14. 计算机科学二审需要多久,寒冬展风采,文体两开花——记计算机科学学院迎新晚会节目二审暨素美部“计体两开花”品牌活动...
  15. 金融壹账通拟7月4日香港上市:2年亏近30亿 市值蒸发超90%
  16. 微信小程序如何支持分享给朋友和分享到朋友圈?如何解决分享朋友圈灰色问题
  17. 启明星辰隔离网闸添加客户端服务器资源
  18. 【工具介绍】fastcopy的下载与使用方法,可用于硬盘对拷
  19. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会
  20. Capture CIS 元件库详细分类解析

热门文章

  1. sql server 查询本周、本月所有天数的数据
  2. 20170623_oracle_SQL
  3. maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器
  4. java 多线程下载文件
  5. 如何快速实现word转为pdf
  6. 关于oracle的certview
  7. python的深拷贝和浅拷贝
  8. eclipse theia_Eclipse的Theia发布,缺少KubeCon,还有更多行业趋势
  9. tpc-c值大于46万_超过46万人参加了2018年慕尼黑啤酒节
  10. slackware_Slackware年满25岁,Perl告白,PowerShell调整,Linux网络,Emacs等