Swift初见
一些
Swift
的学习记录
类型 Type
隐式转换
Swift
不允许类型的隐式转换,如果你需要修改一个变量的类型,请显示转换。
1 | let label = "The width is " |
假如将第三句的String
类型去掉,则会报错:
1 | let label = "The width is " |
一些
Swift
的学习记录
Swift
不允许类型的隐式转换,如果你需要修改一个变量的类型,请显示转换。1 | let label = "The width is " |
假如将第三句的String
类型去掉,则会报错:
1 | let label = "The width is " |
Runtime
一直被一些开发者津津乐道,它强大的API可以帮助你更好的理解OC的运行时机制,也是项目中不可缺少的“黑魔法”。本篇将结合一些优秀的Runtime
文章,简单介绍Runtime
原理以及其应用。
Runtime
运行时的机制对于C语言,函数的调用在编译的时候会决定调用哪个函数。 在编译阶段,C语言调用未实现的函数就会报错。
对于Objective-C
的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,Objective-C
可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。
Objective-C
语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。
这种特性意味着Objective-C
不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。对于Objective-C
来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc Runtime
。Objc Runtime
其实是一个Runtime
库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。
捕手项目的“发现”模块是基于一个
UITableView
来实现的,顶部是banner
列表,有个tabBar
作为table
的sectionHeader
,但是在底部其实是类似一个首页的横向滚动的多页ScrollView结构。
因为之前是用一个
UITableView
,所以每次切换下面的多页结构的时候,需要刷新UITableView
,而且记录每个页面的滚动位置,即便做了数据缓存,其实这种结构是很消耗性能的,而且代码逻辑都混在一起(发现该类的代码已经达到了1050行╮(╯▽╰)╭),bug
容易出现;考虑列表可以抽成ChildVC
子页面来实现代码的分散,用横向滚动的UIScrollView
放入tabBar所对应的ChildVC
的tableView,这样就涉及到今天需要讨论的问题:在UIScrollView
中嵌套UIScrollView
。
一种构思:在加载好mainScrollView
和subScrollView
后,如果页面向上滚动,先滚动mainScrollView
,等tabBar
吸顶时候,mainScrollView
停止滚动,subScrollView
开始滚动。
这样涉及到mainScrollView
和subScrollView
在滚动或者拖拽时,代理方法ScrollViewDidScroll
的监听判断问题,这里为了将逻辑代码分散开,我将subScrollView
放在子控制器来管理。这样就监听需要两个UIScrollView
在滚动的的偏移量ContentOffset
,在临界点时候通知对方,这里使用通知NSNotification
来实现通知。
结构简图如下:
原文:Communication Patterns
Issue 7: Foundation · December 2013
By Florian Kugler
每个应用程序由包含多个或多个松散耦合的对象,这些对象常常需要相互通信才能完成应用的任务。在本文中,我们将介绍所有可用的选项,看看它们在苹果框架中如何使用的示例,最后总结何时使用哪种机制的的最佳实践建议。
虽然这个问题是关于Foundation
框架,我们将超出Foundation
框架中的部分通信机制– KVO
和Notifications
,还准备谈谈delegation
, blocks
, 还有 target-action
。
当然,在有些情况下,没有明确的答案说应该使用什么样的模式,而将选择归结为个人偏好问题,但也有很多情况(模式使用)是非常清晰明确的。
在本文中,我们经常使用“收件人”和“发件人”这两个术语,我们指的是在通信模式上下文中的意思,最好用几个例子来解释:表视图是发件人,而它的代理是收件人。一个核心数据管理对象上下文是它发布的通知的发件人,而不管它们是如何接收的。滑块是动作消息的发送者,实现这个动作的应答者是接收者。一个含有遵循KVO
属性的对象,在变化的是发件人,而对应的观察者是收件人。明白窍门了吗?
八段锦,是一个优秀的中国传统保健功法。八段锦形成于12世纪,后在历代流传中形成许多练法和风格各具特色的流派,它动作简单易行,功效显著。古人把这套动作比喻为“锦”,意为动作舒展优美,如锦缎般优美、柔顺,又因为功法共为八段,每段一个动作,故名为“八段锦”。整套动作柔和连绵,滑利流畅;有松有紧,动静相兼;气机流畅,骨正筋柔。
Charles
是一个代理服务器,这意味着它位于你的应用程序和计算机的网络连接之间。当查尔斯自动配置您的网络设置时,它改变了您的网络配置以路由所有通过它的流量。这允许查尔斯检查计算机上的所有网络事件。
代理服务器处于强大的地位,但这也意味着滥用的可能性。这就是为什么SSL如此重要:数据加密防止代理服务器和其他中间件窃听敏感信息。Charles
还可以生成自己的自签名证书,您可以在Mac
和iOS
设备上安装SSL / TLS
加密。由于此证书不是由受信任的证书颁发者颁发的,所以您需要告诉您的设备显式地信任它。一旦安装并受信任,查尔斯将能够解密SSL事件!
今天看文章发现一片关于
Retain Cycle
的老生常谈的问题,但是作者从开发常见场景的代理和Block
分析了原因,分析的不错,加深了理解,索性小译一下,加上了一些自己的注解。欢迎转载评论,注明原文地址即可~
随着
ARC
的引入,内存管理变得更容易了。然而,即使您不必担心何时保留和释放,但仍然有一些规则需要您知道,以避免内存问题。在这篇文章中,我们将讨论强引用循环。
什么是一个强引用循环?假设你有两个对象,对象A和对象B。如果对象A于对象B持有强引用,对象B于对象A有强引用,那么就形成了一个强引用循环。我们将讨论两种非常常见,需要注意循环引用的场景:Block和Delegate。
1 | A->B: strong reference |
只要妳想要,就能夠做得到!
放弃完美主义,要有乱成一团的心理准备。把“非要完美地完成”,改成“做一点是一点”,一切就有新突破。不做,收获是零,做一点就有一点的收获。
花钱买时间。做“自己不能被替代的事”,其他的事情可以交给别人外包。
别让焦虑消灭斗志。控制情绪就是节约时间。斗志就想气球,一旦因为疲惫、失落泄了气,又得花时间鼓起它,如此反复,会浪费大量时间。
勇敢踏出第一步,然后呢,见机行事。无论第一步有多小,都要踏出去,然后,坚持下来。吉田穗波说的坚持并不是日复一日,而是中途停下来很正常,即使没完成进度还要继续前进。
不是因为某件事很难,你才不想做,而是因为你不想做,让这件事变得很难。