What’sNewOnInternet
第一次到实验室听到这些词是一脸懵逼,我意识到如果要keep up with its development,掌握最新动态是必须的。所以开了这个tag,记录现在的热词。
- G363
- homebrew
- cocoapods
- stackflow
parallels
Swift语言中struct和class
- 面向协议POP
- MVC和MVVM
- ReactiveCocoa
- Github
- clang swift llvm3.6
- CMake语言
- swift silver
- ARC和MRC
- UITableView的渲染顺序
G363
如果你不想科学上网,又想用最棒的引擎,用它准没错!
homebrew
Homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,可以说Homebrew就是mac下的apt-get、yum神器
ruby -e “$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)”
具体使用
搜索软件:brew search //app
安装软件:brew install //app
卸载软件:brew remove //app
cocoapods
项目中会引用许多第三方库
所以cocoapods应运而生
详细教程:
http://blog.csdn.net/showhilllee/article/details/38398119
stackflow
程序员界的知乎,热心的提问和回答吧!
Parallels Desktop
答应我,装虚拟机先考虑这个好吗
Swift语言中struct和class
struct没有继承的功能而class是可以继承的,面向对象语言的核心能力
体现在内存使用上,struct是通过值传递,而class是通过引用传递的
POP
- Swift的核心是面向协议的编程。
- 面向协议的编程的核心是抽象(abstraction)和简化(simplicity)
若太多子类继承了同一个父类,当父类有error时,后果难以置信。。
protocol ErrorPopoverRenderer {
func presentError()
}
extension ErrorPopoverRenderer where Self: UIViewController {
func presentError() {
//在这里加默认实现,并提供ErrorView的默认参数。
}
}
class KrakenViewController: UIViewController, ErrorPopoverRenderer {
func methodThatHasAnError() {
//…
//抛出error,原因是Kraken海妖今天吃人会感到不适。
presentError() //Woohoo! 没有参数了!我们现在有默认实现了!
}
}
VOP
值类型在任何时候只有一个享有者,从而降低复杂度。防止在任何时间点使用引用的话会带来的副作用。Class = 高复杂度,值类型 = 低复杂度。
struct ErrorOptions {
let message: String
let showArrow: Bool
let backgroundColor: UIColor
let size: CGSize
let canDismissByTap: Bool
init(message: String = “Error!”, shouldShowArrow: Bool = true, backgroundColor: Color = Color(), size: CGSize = CGSizeZero, canDismissByTappingAnywhere canDismiss: Bool = true) {
self.message = message
self.showArrow = shouldShowArrow
self.backgroundColor = backgroundColor
self.size = size
self.canDismissByTap = canDismiss
}
所以
protocol ErrorPopoverRenderer {
func presentError(errorOptions: ErrorOptions)
}
extension ErrorPopoverRenderer where Self: UIViewController {
func presentError(errorOptions = ErrorOptions()) {
//在这里加默认实现,并提供ErrorView的默认参数。
}
}
MVC和MVVM
简单回顾一下MVC
各部分之间的通信方式如下。
View 传送指令到 Controller
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈
科普贴:
http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致
前端工程师们与程序开发人员们实现了真正的分离,当然,为了减少重复代码量,前端人员有必要了解一个数据库结构。
前端进行MVVM的JS插件,knockoutjs
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。
附上MVP
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
如果你想系统的学习MVVM,了解DataSource跟Delegate一定要好好看这系列文章
https://www.objc.io/issues/13-architecture/mvvm/
ReactiveCocoa
在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。
其实这些事件,都可以通过RAC处理ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想。
ReactiveCocoa结合了几种编程风格:
函数式编程(Functional Programming)
响应式编程(Reactive Programming)
所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。
以后使用RAC解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。
信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
原文链接:http://www.jianshu.com/p/87ef6720a096
信号会为了控制通过应用的信息流而获得所有这些异步方法(委托, 回调 block, 通知, KVO, target/action 事件观察, 等)并将它们统一到一个接口下.这只是直观理解. 不仅是这些, 因为信息会流过你的应用, 它还提供给你轻松转换/分解/合并/过滤信息的能力.
那么什么是信号呢?这是一个信号:
ReactiveCocoa signal(RACSignal)发送事件流给它的subscriber。目前总共有三种类型的事件:next、error、completed。一个signal在因error终止或者完成前,可以发送任意数量的next事件。
在登录界面中,你可以这样用
监听文本框文字改变:
rac_textSignal:只要文本框发出改变就会发出这个信号。
一句话,核心就是信号,block一定要学好
Github
git太好用了不多说
clang swift llvm3.6
Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成,可以作为多种语言编译器的后台来使用。
Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。
好在哪?
- 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
- 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
- GCC 兼容性。
设计清晰简单,容易理解,易于扩展增强。 - 基于库的模块化设计,易于 IDE 集成及其他用途的重用。
由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。
Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。
CMake语言
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
CMake 使用方法
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。
project(HELLO)
set(SRC_LIST main.c)
add_executable(hello ${SRC_LIST})
swift silver
诸如AppCode、PaintCode、Quick等开发、设计与测试工具已完全支持Swift,而跨平台工具Apportable也已支持使用Swift开发iOS和Android原生应用,如今,又有一款名为Silver颇为强劲的工具让开发者可以直接使用Swift语言来编写iOS、Android、Windows应用。
Silver编译器能编译Swift代码运行在.NET和Java运行时上。开发Silver的公司RemObjects不允许开发者利用它开发完整的跨平台应用,理由是用户界面应该原生开发
ARC和MRC
- * Objective-c语言中的MRC(MannulReference Counting)*
在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
(1) retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2) release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3) autorelease,该方法是将该对象内存的管理放到autoreleasepool中。
- **Objective-c语言中的
ARC(AutomaticReference Counting)**
在ARC中与内存管理有关的标识符,可以分为变量标识符和属性标识符,对于变量默认为__strong,而对于属性默认为unsafe_unretained。也存在autoreleasepool。
MRC与ARC区别示意图
事实上,ARC可能比MRC更慢,但我们还是尽可能使用它,因为他让我们不用过多关心内存的问题。
性能比较分析:http://stackoverflow.com/questions/12527286/are-there-any-concrete-study-of-the-performance-impact-of-using-arc
UITableView的渲染顺序
- numberOfRowsInSection 每个section中有多少行cell
- heightForRowAtIndexPath 每个cell的高度
- cellForRowAtIndexPath 每个cell中的内容
- tableview 根据cell的个数,高度,内容来进行自动布局