Swift初见

Swift初见

一些Swift的学习记录

类型 Type

隐式转换

  1. Swift不允许类型的隐式转换,如果你需要修改一个变量的类型,请显示转换。
1
2
3
let label = "The width is "
let width = 94
let widthLabel = label + String(width)

假如将第三句的String类型去掉,则会报错:

1
2
3
let label = "The width is "
let width = 94
let widthLabel = label + width

阅读更多
Runtime的魔法世界

Runtime一直被一些开发者津津乐道,它强大的API可以帮助你更好的理解OC的运行时机制,也是项目中不可缺少的“黑魔法”。本篇将结合一些优秀的Runtime文章,简单介绍Runtime原理以及其应用。

一、Runtime运行时的机制

  • 对于C语言,函数的调用在编译的时候会决定调用哪个函数。 在编译阶段,C语言调用未实现的函数就会报错。

  • 对于Objective-C的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,Objective-C可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。

  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。

  • 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc RuntimeObjc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。

阅读更多
UIScrollView嵌套的尝试

捕手项目的“发现”模块是基于一个UITableView来实现的,顶部是banner列表,有个tabBar作为tablesectionHeader,但是在底部其实是类似一个首页的横向滚动的多页ScrollView结构。

因为之前是用一个UITableView,所以每次切换下面的多页结构的时候,需要刷新UITableView,而且记录每个页面的滚动位置,即便做了数据缓存,其实这种结构是很消耗性能的,而且代码逻辑都混在一起(发现该类的代码已经达到了1050行╮(╯▽╰)╭),bug容易出现;考虑列表可以抽成ChildVC子页面来实现代码的分散,用横向滚动的UIScrollView放入tabBar所对应的ChildVC的tableView,这样就涉及到今天需要讨论的问题:在UIScrollView中嵌套UIScrollView

一种构思:在加载好mainScrollViewsubScrollView后,如果页面向上滚动,先滚动mainScrollView,等tabBar吸顶时候,mainScrollView停止滚动,subScrollView开始滚动。

这样涉及到mainScrollViewsubScrollView 在滚动或者拖拽时,代理方法ScrollViewDidScroll的监听判断问题,这里为了将逻辑代码分散开,我将subScrollView放在子控制器来管理。这样就监听需要两个UIScrollView在滚动的的偏移量ContentOffset,在临界点时候通知对方,这里使用通知NSNotification来实现通知。

结构简图如下:

UIScrollView

阅读更多
Communication-Patterns【译】

原文:Communication Patterns
Issue 7: Foundation · December 2013
By Florian Kugler

每个应用程序由包含多个或多个松散耦合的对象,这些对象常常需要相互通信才能完成应用的任务。在本文中,我们将介绍所有可用的选项,看看它们在苹果框架中如何使用的示例,最后总结何时使用哪种机制的的最佳实践建议。

虽然这个问题是关于Foundation框架,我们将超出Foundation框架中的部分通信机制– KVONotifications,还准备谈谈delegation, blocks, 还有 target-action

当然,在有些情况下,没有明确的答案说应该使用什么样的模式,而将选择归结为个人偏好问题,但也有很多情况(模式使用)是非常清晰明确的。

在本文中,我们经常使用“收件人”和“发件人”这两个术语,我们指的是在通信模式上下文中的意思,最好用几个例子来解释:表视图是发件人,而它的代理是收件人。一个核心数据管理对象上下文是它发布的通知的发件人,而不管它们是如何接收的。滑块是动作消息的发送者,实现这个动作的应答者是接收者。一个含有遵循KVO属性的对象,在变化的是发件人,而对应的观察者是收件人。明白窍门了吗?

阅读更多
我的读书笔记

最近在豆瓣上读了三本书,内容设计设计模式、数据结构和计算机原理,看完后对底层原理理解更深入些,一些心得摘录到豆瓣的日记中,作为备忘。

FrizzleFur的日记

  1. 《大话设计模式》读书笔记
阅读更多
设计模式 Design Patterns

常见设计模式

App开发过程中,随着业务的不断发展,代码和逻辑不断增加,有时候不得不重构以前的代码,好的架构,利于代码的拓展和重构,下面就简单探讨一下iOS中常见的设计模式吧。

设计模式

阅读更多
八段锦,可以这么萌 【转】

八段锦,是一个优秀的中国传统保健功法。八段锦形成于12世纪,后在历代流传中形成许多练法和风格各具特色的流派,它动作简单易行,功效显著。古人把这套动作比喻为“锦”,意为动作舒展优美,如锦缎般优美、柔顺,又因为功法共为八段,每段一个动作,故名为“八段锦”。整套动作柔和连绵,滑利流畅;有松有紧,动静相兼;气机流畅,骨正筋柔。

阅读更多
Charles学习总结

Charles是一个代理服务器,这意味着它位于你的应用程序和计算机的网络连接之间。当查尔斯自动配置您的网络设置时,它改变了您的网络配置以路由所有通过它的流量。这允许查尔斯检查计算机上的所有网络事件。
代理服务器处于强大的地位,但这也意味着滥用的可能性。这就是为什么SSL如此重要:数据加密防止代理服务器和其他中间件窃听敏感信息。
Charles还可以生成自己的自签名证书,您可以在MaciOS设备上安装SSL / TLS加密。由于此证书不是由受信任的证书颁发者颁发的,所以您需要告诉您的设备显式地信任它。一旦安装并受信任,查尔斯将能够解密SSL事件!

阅读更多
iOS 避免循环引用【译】

今天看文章发现一片关于Retain Cycle的老生常谈的问题,但是作者从开发常见场景的代理和Block分析了原因,分析的不错,加深了理解,索性小译一下,加上了一些自己的注解。欢迎转载评论,注明原文地址即可~

Avoid Strong Reference Cycles

随着ARC的引入,内存管理变得更容易了。然而,即使您不必担心何时保留和释放,但仍然有一些规则需要您知道,以避免内存问题。在这篇文章中,我们将讨论强引用循环。

什么是一个强引用循环?假设你有两个对象,对象A和对象B。如果对象A于对象B持有强引用,对象B于对象A有强引用,那么就形成了一个强引用循环。我们将讨论两种非常常见,需要注意循环引用的场景:Block和Delegate。

1
2
A->B: strong reference
B->A: strong reference
阅读更多
4点起床

4点起床

就因为没时间,才什么都能办到

只要妳想要,就能夠做得到!
放弃完美主义,要有乱成一团的心理准备。把“非要完美地完成”,改成“做一点是一点”,一切就有新突破。不做,收获是零,做一点就有一点的收获。
花钱买时间。做“自己不能被替代的事”,其他的事情可以交给别人外包。
别让焦虑消灭斗志。控制情绪就是节约时间。斗志就想气球,一旦因为疲惫、失落泄了气,又得花时间鼓起它,如此反复,会浪费大量时间。
勇敢踏出第一步,然后呢,见机行事。无论第一步有多小,都要踏出去,然后,坚持下来。吉田穗波说的坚持并不是日复一日,而是中途停下来很正常,即使没完成进度还要继续前进。
不是因为某件事很难,你才不想做,而是因为你不想做,让这件事变得很难。

阅读更多