去中心化DID身份认证的应用解析
????去中心化DID的目的,是在保护用户隐私的前提下,支持在多个网络中共享ID,实现互操作性,从而构建更好的web生态。前一章节 去中心化DID身份认证的技术解析 ,介绍了DID基本的技术原理,这一章节,我们简单描述几个DID的使用场景。
????现在人们已经习惯微信扫码登录,或是支付宝授权登录等,这样就可以用微信账号、支付宝账号直接登录到第三方网站上。所以我们的个人信息是由微信、支付宝保管,相信这些大网站不会崩溃,也不会泄露我们的数据等。但“大数据杀熟”现象就是一个反例,网站利用我们的数据,操纵着我们的支付,这是用户信息中心化管理的弊端。
????以小学生入学登记为例,家长报名时需要出示户口本(证明这小孩户口是在当地,也确实是家长的娃)、房产证(证明房屋是该家长的,该房屋也确实归属于所属校区)外加其他结婚证、疫苗接种证明等。这些证明都是纸质的,都是由相关部门盖章确认了的。只是使用的时候很麻烦,家长需要把所有证件都带上,万一丢了补办也很繁琐。
????微众银行实现的“粤康码”与“澳门健康码”互通项目,就是基于区块链+DID技术实现了跨境身份的认证,使得前往澳门的内地旅客,除了提供核酸证明以外,只需申领“粤康码”即可轻松过关,无需再次填写澳门本地的健康码。
????再以买房为例,在买房前期,售楼处会要求购房者先出示一个资金证明(比如存款>500万),这样的话购房者就需要将好几个银行的资金挪到一家银行,凑够500万后,再开具一个证明给售楼处。对购房者来说,资金在几家银行间来回挪动就是损失,同时也泄露了金额数目。
????如果采用DID就会便捷很多(前提还是多个银行、购房者、售楼处都已经在区块链上注册了DID),流程如下图所示。
????购房者手里有多个银行所给的银行存款证明VC,他可以将这些VC中的金额合并,之后加上零知识证明ZKP的proof隐藏具体的数目,签名后转成VP发给售楼处。售楼处验证这个VP的正确性后,并验证零知识证明ZKP的proof的正确性,确认购房者拥有500多万的资金,但却不知道具体数目。
????伴随着IoT设备的种类扩大,物联网的数据也逐渐丰富起来,但物联网设备的安全,及物联网数据的可信度也逐渐引起人们的关注。
????如果能以DID给物联网设备进行身份标识,就可以控制物联网设备的安全性,并从源头确认数据的可信度。
????以工厂的机器为例,每个机器都由其制造商赋予了一个DID。当机器运转时会产生大量的生产数据,可以将这些生产数据(非敏感的)进行签名,将数据、签名结果和DID一同保存在区块链上。
????机器的制造商可以根据链上数据得知机器的运行情况,便于更好的售后保养服务。
????当企业需要贷款时,银行可以根据区块链上的生产数据,并结合机器制造商的背书,判断企业的生产经营情况,评估贷款风险。 (这也算是区块链跨多方机构使用的一个场景)
???? 以云网盘数据共享为例,如果我想要把网盘上的一些照片发给出版商,就在云网盘上申请一个链接,并加上一个访问密码,交给出版商去访问。出版商拿到这个号码就能取回照片,但这个密码可能给其他人重复使用,就导致我的照片被泄露了。
????采用DID方式,可以相对安全地将数据共享给使用者,如下图所示(前提:数据保管方、数据方、用户都在区块链上注册了DID).
????本章简短地介绍了DID的几个使用场景,也是我目前收集到的。但纸上得来终觉浅,以后可以尝试多种DID,并挖掘出更多真实应用。
2019-03-20 iOS View的生命周期
看到网络层请求的时候,都比较关注什么时候取消请求,什么时候获取数据,又在什么时候去展示数据。这是很多开发者都比较关注的话题。在这里简单分享一下。
网上的资料很多,我们见到的最多的都是view的生命周期从一开始到最后销毁。但是很少有页面间的view生命周期是什么流程的。了解view的生命周期有助于我们选择更加合适的时机去进行view的操作和网络的请求。
View 生命周期
第一个 ViewController 第二个SViewController 第三个TViewController
View的展示及销毁情况
第一个就是
initialize -->init --> viewDidLoad-->viewWillAppear-->viewWillLayoutSubviews-->viewDidLayoutSubviews-->viewDidAppear
然后进入第二个VC
initialize -->init --> viewDidLoad-->此时第一个VC viewWillDisappear-->viewWillAppear-->viewWillLayoutSubviews-->viewDidLayoutSubviews-->此时第一个VC viewDidDisappear-->viewDidAppear
具体的Log如下:
Method: +[SViewController initialize]
Method: -[SViewController init]
Method: -[SViewController viewDidLoad]
Method: -[ViewController viewWillDisappear:]
Method: -[SViewController viewWillAppear:]
Method: -[SViewController viewWillLayoutSubviews]
Method: -[SViewController viewDidLayoutSubviews]
Method: -[ViewController viewDidDisappear:]
Method: -[SViewController viewDidAppear:]
然后进入第三个VC
initialize -->init --> viewDidLoad-->此时第二个VC viewWillDisappear-->viewWillAppear-->viewWillLayoutSubviews-->viewDidLayoutSubviews-->此时第二个VC viewDidDisappear-->viewDidAppear
Method: +[TViewController initialize]
Method: -[TViewController init]
Method: -[TViewController viewDidLoad]
Method: -[SViewController viewWillDisappear:]
Method: -[TViewController viewWillAppear:]
Method: -[TViewController viewWillLayoutSubviews]
Method: -[TViewController viewDidLayoutSubviews]
Method: -[SViewController viewDidDisappear:]
Method: -[TViewController viewDidAppear:]
上面是View的开始,下面看一下view的依次释放。
返回上一个VC
首先是第三个VC(TViewController)调用viewWillDisappear
然后第二个VC(SViewController)即将展示view(viewWillAppear)
在第二个即将展示之后,第三个VC视图消失完成viewDidDisappear
在第三个消失之后,第二个VC展示完成viewDidAppear
最后进行第三个VC dealloc
Method: -[TViewController viewWillDisappear:]
Method: -[SViewController viewWillAppear:]
Method: -[TViewController viewDidDisappear:]
Method: -[SViewController viewDidAppear:]
Method: -[TViewController dealloc]
返回第一个VC
首先是第二个VC(SViewController)调用viewWillDisappear
然后第一个VC(ViewController)即将展示view(viewWillAppear)
在第一个即将展示之后,第二个VC视图消失完成viewDidDisappear
在第二个消失之后,第一个VC展示完成viewDidAppear
最后进行第二个VC dealloc
Method: -[SViewController viewWillDisappear:]
Method: -[ViewController viewWillAppear:]
Method: -[SViewController viewDidDisappear:]
Method: -[ViewController viewDidAppear:]
Method: -[SViewController dealloc]
最后再进行一次Push操作
我们再观察一下View的生命周期情况
Push
Method: -[SViewController init]
Method: -[SViewController viewDidLoad]
Method: -[ViewController viewWillDisappear:]
Method: -[SViewController viewWillAppear:]
Method: -[SViewController viewWillLayoutSubviews]
Method: -[SViewController viewDidLayoutSubviews]
Method: -[ViewController viewDidDisappear:]
Method: -[SViewController viewDidAppear:]
到此,差不多我们都有一个整体认识了,对view的生命周期有一个更加清晰的了解。Demo就不传了,很简单的,自己写一下方法,从新定义一下log什么都看到了。
有什么错误的地方欢迎各位大大指点与批评.
去中心化DID身份认证的技术解析
????去中心化数字身份(Decentralized Identity,DID)是基于区块链技术建立起来的一种数字身份系统。它可以保证身份数据真实可信,同时也能保护身份用户相关的隐私,确保跟个人身份相关的数据归属于个人所有。很吻合2021年11月开始实施的《中国个人信息保护法》,有没有?
V1.0 传统的身份认证 :用户在每个网站上都重复注册账号,使用账号+密码的方式登录,每个网站各自掌握着用户的身份信息,如图1(a)所示。
缺点 :重复注册账号,用户会时常不记得账号密码;而且多个网站都有用户的信息,也导致信息泄露。
V2.0 以单点登录代表的身份认证 :用户在一个网站上注册的账号,可以授权登录到其他网站,比如在支付宝、微信、facebook、google等网站注册号账号后,授权登录到其他网站,如图1(b)所示。
缺点 :用户的信息都掌握在几个大网站内,会有”店大欺客“的成分存在,也容易出现信息泄露的情况,如facebook的用户信息泄露问题。
V3.0 去中心化的身份认证 :用户保管自己的身份信息,在必要的时候,以最小化的方式出示给各个网站确认即可,如图1(c)所示。
算缺点么? 需要区块链作为底层技术支撑,将区块链作为一个可信任的第三方,来保证身份信息的完整性和正确性。
????DID 文档是对DID的详细说明,是一对一的关系,可以看作由两部分组成:DID metadata,以及 DID public key,如图4(a),其中public key是关键,用于数字签名或加密操作等。
????一般 DID 由用户自己保存,而将DID document 保存在区块链上(可以DID为 key 做索引),以保证DID document 的正确性。
????当用户在区块链上注册 DID 时,可以根据智能合约生成DID 及相关的document,并由智能合约负责 DID在链上的读取和更新等。
????DID的认证过程涉及四方的交互:证书颁发者,证书持有者(可以拥有一个app保存多张证书凭据VC),验证方,以及DID注册系统(比如区块链)。
????证书颁发者是一个权威机构,比如某大学、公安机关等;持有者会保存权威机构发布的凭据VC(比如从大学拿到的毕业证,公安机关拿到的身份证等);验证者会对这些凭据的表示(VP),并结合区块链上的信息进行验证。
????DID认证的前提是权威机构、VC持有者、验证者都已经在区块链上注册了各自的ID。
VC(Verifiable Credential) : 可验证的凭据,这相当于大学颁发的毕业证,或是公安机构颁发的身份证等。其格式如图4(b)所示,包括:
(1) VC metadata,比如发行人、发行日期、声明(claim)的类型等;
(2) claim: 是一个或者多个关于主体的说明,比如身份证凭据的声明包含:姓名、性别、出生日期、民族、住址等;
(3) proof证明:保存了颁发者的数字签名,用于验证该VC的正确性及来源等。
有些实现方案中使用app或是钱包存储VC,持有者自己保管,也可以将VC存在区块链中,作为私密数据保存。
VP(Verifiable Presentation) : 可验证的凭据表示,或者说是可验证的凭据的展示方式,有些场景下持有者不便于将VC直接给验证者看,或者一次验证中会涉及多个VC,所以就将一个或多个VC包装成VP,其格式如图4(c):
(1) VP元数据,包含了版本等信息;
(2) VC列表,要对外展示的VC的内容,如果是选择性披露或者隐私保护的情形,就需要对原始的VC做一些变动并加上对变动的证明。
(3) proof证明,主要就是持有者对本VP的签名信息。
????VC中的claim五花八门,可能是大学毕业证书、身份证、驾驶证、结婚证等,为了能正确地解析,就需要提前在区块链中注册其解析方式。
????这种事情一般由Authority来完成,按照业务场景分类,定义不同类型数据结构的Claim结构,并注册在区块链上,以保证全网通用。
???? 以身份证为例,其完整的VC凭据包括姓名、性别、出生日期、民族、住址、照片等。在买火车票时,可能只需要姓名和身份证号码;上学报名时,可能仅需要姓名、出生日期等;确认少数民族身份时,必须要明确民族信息。所以很多场景下,不是全部选项都需要,可能只需要其中的一两项,可以仅仅披露必须项。
????但如何确认披露的这几项是正确的,没有被修改过呢?这里用到了经典的Merkle Tree结构,如图5所示。比如在只需要披露生日的场景下,就可以借用”生日“的兄弟选项”民族“,以其到树根的路径
???? 比如证书到期了,颁发者需要撤销之前发布的凭据VC,这里用到了密码学中的累加器。
???? 在颁发者发布VC时,会给每个VC都设置一个大素数,并保存所有大素数的RSA累加结果;当需要撤销某个VC时,就先用该VC的大素数去除Accumulator,并更新Accumulator,之后验证时,用 VC 对应的大素数去除 Issuer 公开的 Accumulator,如果能整除,则表明是VC是有效的(未被撤销)。
????基于Ethereum,比较知名的DID是uPort。我也曾关注过Hyperledger的DID项目 Hyperledger Indy,但其底层采用了自己的一套区块链架构,而非Hyperledger Fabric,这估计是基于Fabric 的DID实现的场景较少的原因。微众银行FISCO BCOS基于自己的BCOS架构,实现了自己的一套 WeIdentity .
???? 该章节只简单讲述了DID是什么,并粗略介绍了其使用原理,还有很多细节未能一一道来,如需要更多细节请移步:
在本文中介绍了DID的单一实现方式,今天看到另外一篇博客 Demystifying Digital Identity (2/2) 或参考其翻译 揭开数字身份的神秘面纱2/2 ,建议通过一组链接文档来实现扩展的DID,以信息图谱的方式来组织文档,如主链、关联的多个账户、分类的基本信息profile、关联的外部服务或资源等,如下图。这样的DID,就可以对接任何应用程序、服务或用户,而且是一个全球可用的、分布式的、可审查的DID。
我对Web2+Web3=Web5的第一印象
作者:老雅痞
自从Web5在6月10日午夜横空出世以来,已经过去一段时间了。 当 “Web5 “这个词和meme图片开始在Twitter上出现时,我以为是个笑话。但当我读完PPT(Web5:去中心化的网络平台)后,我对它的严肃性感到惊讶。
一些人立即开始认为这是真的,但其他许多人似乎感到不解。时机是正确的,甚至Web3也刚刚开始被大众认可,然后突然 “5 “被发布,跳过了 “4”。似乎能够立即对Web5作出反应的人是那些对现有的Web3感到不舒服的人。我对各种观点印象深刻,因为根据他们不舒服的地方,坚持的观点是不同的,如网络架构、经济思想、商业结构等等。
基本上,演讲的内容集中在系统的架构上。背景想法和他们未来的目标是什么样的 社会 效益,只是通过在做演讲的会议上的评论和成员的推特来补充。所以基本上,除非你是一个系统架构师,或者一直在区块链世界里的人,对网络了如指掌,否则很难理解。如果只是像DID这样的关键词,那都是已经出现的。因此,这个Web5的影响是什么?”就是它了!”这种感觉表达了架构和设计,这些架构和设计就像解决了一个难题一样。我认为这确实是 “Web2+Web3=Web5″。此外,我个人再次感受到了类似于美国在互联网中的领导地位的来源,他们没有把已经存在的东西视为理所当然,而是从基础上呈现出一个新的外观,没有留下任何不舒服的感觉。
综上所述,以下是我感受到的影响:
2010年代,以移动和大数据为开端的十年,推动财富和信息向大 科技 公司集中,十年后,社交媒体影响选举,广告跟踪和过滤泡沫成为问题,互联网对 社会 的负面影响也成为焦点。由于浏览器中的第三方cookies开始被禁用以应对这些增长,安全和隐私的核心问题是个人信息资产的处理。
Web5支柱DWN(去中心化的网络节点)、DID(去中心化的标识符)和VC(可验证的凭证)正视这一问题。DID是一种建立VC的机制,没有特定的提供者,而DWN是基于DID/VC在应用端分发必要信息的基础。举个简化的例子,VC是驾驶执照,DWN是租车预订信息。租车预订信息是可以被多个机构引用的信息,如 汽车 租赁公司和旅行社,并得到个人的许可。显示个人属性和偏好的执照和预订信息一直是服务提供商的竞争力来源,他们积累和分析这些信息,通过广告和交叉销售实现货币化,并在社交媒体和其他媒体上创造过滤泡沫。Web5是一个关于将这些信息放回每个人手中的架构的建议,以及如何为此目重塑互联网。
由于Web5是由推广比特币的blockquan Inc.(原Square)旗下的TBD提出的,所以很容易认为它是基于比特币的,但如果你仔细阅读PPT,你会发现 “比特币 “一词根本没有出现。只有一个名为tbDEX的基于比特币的应用程序和一个名为ION的DID解决方案,而这只是作为专有名词出现在例子中。因此,Web5的设计本身可以用比特币以外的其他区块链来完成,它保持了一定程度的抽象性和中立性,以至于区块链甚至不需要开始。DWN、DID和VC都是由一些标准组织如W3C或DIF讨论的,这是一个有明确职责的协议和堆栈的集合。它们是具有明确职责的协议和堆栈的集合。
在我上一篇文章(超越OSS的一步)中,我列举了四个要素作为commons在互联网和软件中驱动的条件,并以Web的狭义HTML/HTTP/URI为例进行了说明.下面重述这些要素:
回顾一下PPT,我认为所有的元素都得到了很好的满足。每个协议都是独立的,可以自由组合和扩展,因此很容易发明下一个协议,而且它遵循互联网的原则,可以以几乎无限的方式进行扩展。因此,它可以与Web2顺利结合。PWA是Web2的技术成果之一,也可以顺利结合,DWA(Decentralized Web Apps)将作为一个进一步的发展被提出。”Web2+Web3=Web5 “是一个真实的说法。
需要特别注意的一个领域是DWN。在设计这种东西时,出现了如何为每个应用程序的具体用途添加模式的问题。新类型的个人信息资产在各个领域陆续产生,还有比特币的容量问题。因此,我把DID解释为只存储最重要的凭证和分布式访问控制基础设施,就像PKI的延伸,为DWN提供加密密钥。因此,我把DID解释为只存储最重要的凭证和像PKI的扩展一样的分布式访问控制基础设施,它为DWN提供加密密钥,而DWN是一个扩展的存储,可以扩展到更多不同的数据,而不增加DID的负担。通过使用查询参数,DWN与DID本身分离,同时保持DID的命名空间,因此DWN可以在个人和产品轴上自由和无限地建立。
顺便说一句,既然我们在讨论比特币而不是Web5,我仍然认为比特币的L2,LN(LightningNetwork),也得到了满分。我个人认为,比特币的未来将是专门的L2的发展,其职责单一,比如LN负责支付,ION负责身份。L1甚至不需要一个账户,更不用说智能合约了。这就是当我们深入研究货币的SoV(价值储存)和MoE(交换媒介)的性质时,会出现的结论。
作为Web3核心的智能合约平台,不仅是货币的平台,也是以物换物的平台,用智能合约取代Web2应用的挑战也正在被接受。我就不说这是多少计算机工程的废话了,也不说这是不尊重进步积累的资产的野蛮行为,正如各种学者所谴责的那样,但至少智能合约平台是以边缘域应用的性质为导向的,是Simple Made Easy的。
至于智能合约平台本身,我觉得很有用。正如在上一篇文章中提到的,作为一种不仅对源代码而且对可执行代码实现透明的机制。我也觉得DAO & Governance Token of Securities 2.0/KKK 2.0 有潜力成为互联网 社会 的一种新形式。Rollup 仍然可以实现具有单一职责的特定 L2,它也可以是单个应用程序。但是,我越来越怀疑区块链的 L1 是否有必要。它太密集了。未来我们越是尝试扩展用例,密度的负担就会越明显,例如私钥撤销的管理。
随着前年开始的新行业创建的 “pump”,Web3发生了很大的变化。即使他们认为有些东西是错的,他们也会把现有的东西当作是既定的,并专注于在其基础上改进服务。这是一个明显的海绵计划,但我们可以看到那些热衷于改进的人变成了一个 “好的海绵”。虽然是 “去中心化”,但在最后,用户期望并支持管理层维持价格率和补偿损失。重点已经转移到客户想要什么和大众容易理解的东西,而不是什么是正确的。
对于顶级应用程序服务来说,这是很自然的事情,但我们不应该重新考虑“去中心化”标牌吗?Web5 表示“去中心化”到此结束。这取决于身份的基础。最重要的应用程序可以是 Web2。项目成员还说“No token”和“No SmartContract”,在文档中出现了一点。这其中的真正含义还不清楚,但至少很清楚,不会围绕这次呈现的身份基础设施使用。身份不需要代币或投票治理。这不是可以交易的东西,也不是由多数票决定的东西。
Web5 被精心设计为抽象和中立的,但我可以肯定地说它的诞生本身就是由比特币诞生的。比特币诞生于金钱是什么的问题?什么是价值?什么是经济自由?没有妥协。以比特币为师,Web5 会问“去中心化”是什么意思?什么是人权?当前的网络缺少什么?互联网的未来需要什么?
当他们找到这个问题的答案时,他们将从互联网的基础上改变它。我越看越觉得这个名字很合适,但说实话,我也认为Web5这个名字本身并不重要。重点是在互联网上实现身份,建立在密码学、数学和计算机科学的核心之上。它面临的障碍很多,我可以立即想到。它是关于改变使现有服务盈利的动力,也直面不同国家的个人信息法等法律原则的差异。前进的道路是深远的,真正的长期愿景,我称之为不连续创新的挑战,我对它的巨大规模感到震惊。
如果我们用Web5的目标来思考互联网的架构,如果我们认为它是在网络层和应用层之间创造一个资产层,可能会更容易让人理解。虽然比特币已经成功地使货币成为互联网的原生部分,但我们现在要使身份成为互联网的原生部分。钱是一种金融资产,身份是一种个人信息资产,如果把两者抽象到另一个层次,它们可以被归类为 “资产”。一个在互联网上,但个人的主权得到保障的资产库被创造出来,在他/她的许可下,可以被更高层次的应用程序使用,以进一步丰富我们的日常生活。
把小额支付LN和身份放在一起,我们也将看到互联网广告模式的转变。我还没有看到这样的故事,但我假设肯定有一批人在那里已经开始寻找实现方案了。毕竟,blockquan和TBD是由Twitter的联合创始人杰克多西领导的,他一直在为社交媒体的货币化理想而奋斗。另外,既然叫DWA,他们很可能在寻求商店分销的民主化。随着智能手机的市场越来越大,iPhone和安卓成为两个主导者,从应用方面反对支付费用的寡头垄断,对民主化的要求只会越来越强烈。比特币/LN和DWP(去中心化网络平台)的结合将提供基本成分。当然,移除应用商店并将其原生安装在操作系统中困难重重。
Web5背后的哲学以及它旨在实现什么样的 社会 效益还没有被完全讨论。项目成员也表示,未来有很多问题需要解决,而Web5只是项目的框架。然而,这个架构的未来是非常有想象力的。
然而,当人们揭开网络和互联网的 历史 时,就会发现这样的做法在过去的美国实际上已经发生并成功了很多次。关于互联网如何像钟摆一样在法律和软件之间摇摆的 历史 ,在Lawrence Lessig的书中有详细介绍,我在上一篇文章中提到了这一点。甚至在网络出现之前,互联网就一直在反复尝试,每当它变得更加中心化的时候,就会对它进行改造,让它重新摆回到去中心化的状态。其成功的 历史 似乎被很多人分享,无论我们应该称之为文化还是共同的知识。这就是为什么我认为这次要以一种轻松的方式再次介绍它。
以下是 “mother of all demonstrations”的演示,在还没有个人电脑的时候,它想象并塑造了未来的计算机。这也是一种真正大胆的、必不可少的方法。鼠标在这里得到了体现和命名。今天在互联网上已经很常见的超文本,也出现在未来计算机的核心位置。
Douglas Engelbart,这个演示背后的人,晚年的生活相当不愉快。他并不是一个让人奉承的人。但我相信,正是因为这种人性,他才能够追求实现他的愿景和赋予他的想象力所需要的东西,而不去斤斤计较有多少人会爱他。另一方面,我也相信,他一个人只能走这么远。为了使之成为现实,他还需要其他知识和能力。让许多人参与进来,分享相同的愿景,以传播它,也是很重要的。Engelbert的鼠标有两个正交的X和Y盘,但在20世纪70年代,其他人开发了一个球型鼠标,成为主流。超文本由网络普及,由ARPANET(Engelbert先生也是该网络的参与者)和其他项目(如Xanadu项目)丰富。概念和理论的发明之后是架构的发明,然后是传播的发明,几十年来,许多人的接力棒一直在延续。
互联网最初是一个分享文件的系统。超文本,其核心是在网络诞生前40多年就被构想出来了(正如我们所想)。它在20多年前就被赋予了形式。我们对Web5了解得越多,无论它将来叫什么名字,它似乎都处于 历史 的最前沿。
ios uiviewcontroller view的回调有哪些
UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下:
调试日志:
1
2
3
4
5
6
7
8
9
2013-07-14
12:15:49.048
VCTest[13412:907]
initWithNibName:bundle / initWithCoder
#如果使用的StoryBoard
2013-07-14
12:15:49.056
VCTest[13412:907]
loadView
2013-07-14
12:15:49.059
VCTest[13412:907]
viewDidLoad
2013-07-14
12:15:49.061
VCTest[13412:907]
viewWillAppear
2013-07-14
12:15:49.078
VCTest[13412:907]
viewWillLayoutSubviews
2013-07-14
12:15:49.083
VCTest[13412:907]
viewDidLayoutSubviews
2013-07-14
12:15:49.445
VCTest[13412:907]
viewDidAppear
2013-07-14
12:16:00.624
VCTest[13412:907]
viewWillDisappear
2013-07-14
12:16:00.997
VCTest[13412:907]
viewDidDisappear
1. initWithNibName:bundle:
初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。
如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib:
1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
2. loadView
当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper
loadView];)。
1
2
3
4
5
6
7
8
9
10
11
12
-(void)loadView{
NSLog(@"loadView");
//错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view
self.view.backgroundColor
=
[UIColor
greenColor];
}
-(void)loadView{
NSLog(@"loadView");
//正确,先初始化view
self.view
=
[[MyView
alloc]
init];
self.view.backgroundColor
=
[UIColor
greenColor];
}
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
3. viewDidLoad
当VC的view对象载入内存后调用,用于对view进行额外的初始化操作
4. viewWillAppear
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等
5. viewDidAppear
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper
viewDidAppear];
6. viewWillLayoutSubviews
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。
7. viewDidLayoutSubviews
view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。
8. viewWillDisappear
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。
9. viewDidDisappear
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
10. viewWillUnload
在VC的view对象从内存中释放之前调用,可以在view被释放前做一些资源清理操作。在iOS6.0开始就废弃了,该方法不再会调用
11. viewDidUnload
在VC的view对象从内存中释放之后调用,可以在view被释放后做一些view相关的引用清理操作,此时view为nil。在iOS6.0开始就废弃了,该方法不再会调用
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
u