最近在看SDWebImage的源码,其中对block中循环引用问题的处理值得学习。之前的项目也遇到过循环引用的问题,遂有必要研究总结。
当block直接或间接的被self持有时,需用weakSelf
|
|
|
|
block中需多次访问self,需用strongSelf
只使用 weak 的问题在于,如果在block中必须多次使用到weakSelf会有危险。因为在多次执行下,weakSelf有可能变为nil。所以需要使用strongSelf,确保 self 的有效性。
|
|
|
|
做让自己佩服的人~
最近在看SDWebImage的源码,其中对block中循环引用问题的处理值得学习。之前的项目也遇到过循环引用的问题,遂有必要研究总结。
|
|
|
|
只使用 weak 的问题在于,如果在block中必须多次使用到weakSelf会有危险。因为在多次执行下,weakSelf有可能变为nil。所以需要使用strongSelf,确保 self 的有效性。
|
|
|
|
提供用户界面
OS X用户体验层中的组件:
iOS的架构在用户体验层之下基本一致,但是在用户体验层很大区别。SpringBoard完全负责所有的用户界面的任务。
Aqua是OS X的GUI。主要介绍Aqua任何支持GUI的相关特性。
系统的第一个用户态进程launchd负责启动GUI。支持GUI工作的主进程是WindowServer,且WindowServer是Core Graphics框架的一部分,而Core Graphics位于另一个框架Application Services中。因此,WindowServer的路径是:
|
|
WindowServer启动时传入 -daemon 开关参数。WindowServer的代码实际上不完成任何实际的工作,所有的工作都是CoreGraphics框架中的CGXServer函数完成的。
CGXServer会检查自己是否以后台服务程序或者以主控制台getty的方式运行。然后在后台fork出自己的子进程。当子进程准备好之后,LoginWindow进程(同样由launchd启动的)启动交互式登录过程。
QuickLook允许在Finder中快速预览多种不同类型的文件,不需要双击鼠标打开文件,只需要按下空格即可。
QuickLook采用的是可扩展的架构,使得大部分工作是由插件完成。这些插件是后缀为 .qlgenerator 的bundle,只需要将这些bundle文件拖放到QuickLook目录(系统范围的QuickLook目录为/system/Library/QuickLook,针对个人的胃~/Libaray/QuickLook)中即可完成插件的安装。
插件不是独立可执行程序,没有传统的main()入口点,而是实现了QuickLookGeneratorPluginFactory入口点。另外有一个配置文件 负责将插件和对应的文件类型关联起来。文件类型通过UIT表示,即逆DNS表示法。
quicklookd是系统的”QuickLook服务器”,是通过以下文件
|
|
在登录时启动的。这个后台服务程序本身在QuickLook框架中,而且不带GUI。
qlmanage命令的作用是维护插件,并且控制后台服务程序。
spotlight背后的核心是一个索引服务器mds,mds在MetaData框架中,而这个框架是系统核心服务的一部分
|
|
mds是一个没有GUI的后台服务程序。每当有任何文件操作(创建/修改/删除)发生时,内核会发送通知給mds,这个通知机制称为fsevents。
当mds收到通知时,mds会通过mdworker进程将各种元数据信息导入数据库。mdworker进程可以加载一个具体的Spotlight Importer从文件中提取元数据信息。
导入器路径(系统:/system/Library/Spotlight 用户:/Library/Spotlight),和QuickLook类似,这些importer是实现了固定API的插件。
OS X中的Darwin是一个完全成熟的UNIX实现。
Terminal默认打开的shell是/bin/bash
OS X和iOS中的命令行工具还可以通过telnet和SSH远程访问。OS X和iOS默认禁止,OS X打开方式如下,iOS需要jailbreak。
|
|
OS X和iOS采用的都是HFS+的文件系统,HFS+总是保存大小写的区别。
iOS采用HFSX,默认对大小写敏感。OS X则未采用。
OS X是符合UNIX标准的系统,具有标准的UNIX目录结构:
每一个bundle都带有相同的目录:
|
|
OS X对应用程序的处理方式是较为整洁地包装在bundle中,应用程序的bundle包含运行这个应用程序所需要的大部分文件。
在iOS中,app的结构没有这么整洁。iOS会区分苹果提供的默认的应用程序(/Application目录下),越狱情况和通过App store购买的app(/var/mobile/Application目录下)。
通过Store购买的app安装在一个表示128位GUID的目录下。
当iOS app在运行时,会被chroot到自己的应用目录,即名字为GUID的目录,应用程序将自己GUID名字的目录当作根目录,因此/tmp指向的是GUID/tmp。
从store购买应用时,应用以.ipa文件的形式打包,这种文件实际上就是一个.zip文件,这个文件在Payload/目录下压缩了应用程序的目录内容。
一个标准的info。plist文件包含以下条目:
CodeResources实际上是一个指向_CodeSignature/CodeResources的链接。这个文件是一个属性列表,包含bundle中所有其他文件的列表。这个属性列表只有一项files,是字典。key对应文件名,value是Base64格式的散列值。
CodeResources文件可以用与判断一个应用程序是否完好无损,能够防止不小心修改或损坏资源文件。
framework bundle和app bundle的不同:内建的版本化机制:框架可以包含多个版本的代码,不同版本并排放在不同的子目录中。
Cocoa框架包含了其他3个框架:AppKit,CoreData和Foudation。封装了其他框架的框架通常称为 保护伞框架(umbrella framework).
// TODO 本章还有些后续内容,更为底层,以后了解更深时过来交作业~
编译可参考 TF 的 ios_examples 的 ReadMe 。
|
|
|
|
|
|
执行成功后在 makefile/gen/lib 下生成 libtensorflow-core.a 库。
此时还差一步即可运行 TF 提供的Demo:添加数据模型。
执行下面命令,或者可以手动下载 Inception。然后copy到相应路径下。
|
|
现在可以运行三个实例工程啦~
深度学习已经🔥的不要不要的了,作为码农,现在还不学习TF真的是要out了。
参考官方的 install guide 即可安装成功。
我是通过 virtualenv 安装的,之后每次使用 TF 时都要 activate virtualenv environment。可使用以下两个命令中的任意一个。
|
|
成功后,终端的 prompt 会变成如下,则可以使用 TF 了。
|
|
当结束TF后,需要 deactivate virtualenv environment。运行以下命令:
|
|
最近工作遇到了一些挑战,不是来源于技术,但是根源还是自己的能力不能被他人认可。遂下定决心开始有规划,有持续性地总结和记录。第一步就从搭建这个博客开始~
搭建博客主要分为以下步骤,其中 accessory 是可选的。
安装 Node.js
直接到Node.js 官网下载最新版本即可。 或者通过 Homebrew 安装。
若想卸载旧版本的Node.js,可运行以下命令。
|
|
安装 Hexo
|
|
本地初始化博客文件夹,例:~/Blog
|
|
修改站点配置文件 ~/Blog/_config.yml, 关联Github信息
|
|
注意:每一项的“:”后面都要保留一个空格,deploy部分的参数前面保留两个空格。
|
|
http://localhost:4000/ 可看到搭建好的博客,确认前面操作是否成功
|
|
此时可以在Github上对应的Repo看见本地 ~/Blog/public 文件的内容,打开博客主页 your_github_name.github.io 即可看到搭建的博客的主页啦。
|
|
以上命令即可创建一篇博文并提交到Git上,~/Blog/Source下存储每篇博文的 .md 文件。删除该 .md 文件即可删除对应博文。再次运行以下命令即可生成静态网页并发布。
|
|
若刷新博客时发现问题,则可运行以下命令清理已生成的静态网页。
|
|
Hexo可以选择多种主题,集成评论,数据统计和搜索等第三方功能。推荐一个经典主题:Next。其配套的相关文档详细介绍了集成第三方服务的步骤。
用这样一句经典的话结束第一篇博文,望自己 Hack On~