0%

阅读博文《深入理解RunLoop》后的整理。
博文从RunLoop的底层代码切入,介绍RunLoop的实现原理,并相应的讲解Apple基于RunLoop的开发,例如屏幕触摸,UIGestureRecognizer,performSelector等。

首先简要的说一下写博文介绍的意义。看完一篇博客之后,尝试用自己的话说出来,是梳理知识的过程。同时,也方便我以后快速review,也给各位一个参考。
博文介绍系列尝试用简介明了的话去概括原博文,因此相对来说也不会特别详细,见谅。但是,会将博文中提到的知识点进行罗列,并且会做一些补充。方便查阅。

博文介绍

博文来源:《深入理解RunLoop》

RunLoop机制

简单来说,RunLoop实际上是在不停的循环处理事件。在每一个循环中,如果有事件需要响应则立刻响应,无事件响应时则休眠。

  • RunLoop结构包含有多个Mode。Mode中保存着Source,Observer,Timer。顾名思义,Source是事件来源,分为两类,Source0类型的事件不会主动唤醒休眠的RunLoop,需要外界主动唤醒;Source1类型的事件利用Mach实现,可以唤醒休眠中的RunLoop。Observer是观察者,RunLoop进入不同的阶段时会相应的通知到Observer。Timer则是计时器的事件。

  • RunLoop可以在多个Mode之间切换。切换到特定Mode时,只会处理该Mode下的Source/Observer/Timer。不过,RunLoop中还保存着CommonModeItems,在RunLoop内容发生变化时,RunLoop会把CommonModeItems中的Source/Observer/Timer同步到标记为Common的Mode中。

  • 一个线程最多有一个RunLoop。RunLoop在获取的时候创建。新建立的线程如果从来没有获取过RunLoop,则该线程没有对应的RunLoop。

阅读全文 »

整理了一下Hexo博客使用方法和技巧。不定期更新Hexo的主题。

最直接的文档资料获取:Hexo官网

Windows下Hexo安装配置

  • 下载安装GitBash
  • 安装Node.js
  • 安装Hexo
    1. npm install -g hexo-cli
    2. npm install hexo --save

Mac下Hexo安装配置

最近新入手一台Mac。在此记录下Mac的Hexo配置。

  • 安装Node。先安装Homebrew。然后运行命令sudo brew install node
  • 安装Hexo。正常情况下,运行命令:sudo npm install -g hexo-cli
    但是不知道是网络不好还是怎样,一直报Error。尝试sudo npm install -g hexo-cli --registry=https://registry.npm.taobao.org成功!
阅读全文 »

最近一个月学习了 iOS 开发相关的知识。Objective-C 的内存管理是最基础也是最重要的。以此篇博客作一个记录,并为后来学习 iOS 开发的同学提供一个参考。

OC 内存管理简介

OC 的内存管理不同于 C++ 的内存管理方式。C++ 的内存管理方式相对来说比较简单粗暴,new 出来的内存,不用的时候 delete 掉就行。
OC 的内存管理采用了引用计数的方法。简单的说,就是对每一个对象都保存一个引用计数值,当程序中增加一个对该对象的引用时,引用计数值增加 1;反之,程序中减少一个对该对象的引用时,则引用计数值减少 1。当引用计数值为0是,系统释放对象。

OC内存管理的原则:谁拥有,谁释放

阅读全文 »

这篇文章是对英文文章「Best practices in Android development」的翻译。文章主要为一些Android开发的建议,涉及项目目录结构,IDE,测试框架等内容。这些建议都是Futurice公司安卓开发者实践得出的结论,很有借鉴意义。当然,你可以选择不理会这篇文章提出的建议,只要你觉得你现在的开发习惯更适合你自己,更加有效率。

本文发布于伯乐在线最佳实践之一:安卓开发篇,未经许可,禁止转载。感谢toolate的校稿。以下是译文。

这篇文章主要为Futurice公司Android开发者总结的经验教训。遵循这些规范可以避免无谓的重复劳动。如果对iOS或Windows Phone平台的开发感兴趣,请查看iOS最佳实践文档Windows客户端最佳实践文档

欢迎反馈,但请先阅读反馈规范

阅读全文 »

这篇文章主要讲述C++语言的基础。文章不涉及C++最基础的语法,主要为一些熟悉C++后需要注意和学习的点。包括的内容有const,mutable,virtual等。

const修饰

  • const成员函数不能调用非const成员函数,不能改变非static成员变量,可以改变static成员变量。
  • const成员函数可以改变mutable关键字修饰的成员变量。
  • const实例不能调用非const成员函数。
  • const type* pobj表示pobj是指向的内容不可变;type* const pobj = &instance表示pobj不能改,而且需要初始化。
  • 返回值设置为const可以避免像(a * b) = c这样的错误。当a和b为内置类型时,那直接了当的不合法。但当a和b为自定义类型时,是有可能是合法的,当为了避免这种没有意义的语句,将operator*的返回值设为const。
  • const_iterator迭代器指向的值不可更改;const std::vector<int>::iterator iter = vec.begin()指iter不可更改。
  • 类内const int x = 100;在某些c++版本中不合法,建议用enum代替实现。
阅读全文 »