唐巧的博客

苹果推出了官方的分析工具
苹果在五月一号这天,向开发者发送邮件,邀请参与他自家的分析工具的试用。虽然现在我们公司猿题库的帐号还处于排队等待的状态中,不过我们可以从苹果的介绍中看出这个工具的特点 无需额外操作 You ...
QCon 参会笔记
前言这两天在北京国际会议中心,QCon 全球软件开发大会正如期举行,我有幸参加了此次会议。QCon 此次参会的人数远远超过了主办方的预期,以至于提前关闭了报名通道。大会现场很多演讲人员爆满,现场...
《从 0 到 1 》读书笔记
我每天坐地铁上班和下班,在路上的时间加起来有1个半小时。但有一个好处是:在地铁上,你除了看书也没什么事情可干。于是,最近看完了《从 0 到 1》。这本书的作者是:彼得·蒂尔(Peter Th...
iOS 开发中的争议(二)
打算分享一些有争议的话题,并且表达一下我的看法。这是该系列的第二篇。 在本文中,我想讨论的是:对于 UI 界面的编写工作,到底应该用 xib/storyboard 完成,还是用手写...
iOS 开发中的争议(一)
序言打算分享一些有争议的话题,并且表达一下我的看法。这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h...
流行的方法论 - 读《引爆点》
春节的时候看到了萧宸宇的博客中一篇名为 《读书笔记 「引爆点」》 的文章。受文章的吸引,于是把 《引爆点》 这本书学习了一下。 《引爆点》的作者格拉德威尔在书中主要讲解了他对于 “流行现象”...
谈谈 React Native
前言几天前,Facebook 在 React.js Conf 2015 大会上推出了 React Native(视频链接)。我发了一条微博(地址),结果引来了 100 多次转发。为什么 Re...
写iOS SDK注意事项
我发现即使是像腾讯、小米这样的大厂提供的 SDK,在质量和规范上也有很多问题,而且包括我以及我身边的很多朋友都被恶心到了,所以我就把这些注意事项总结出来,希望大家不要犯同样的错误。 注意事项一:...
使用蒲公英来做iOS测试应用的分发
前言我在 《给 iOS 工程增加 Daily Build》 一文中介绍过如何用命令行生成 IPA 文件以及通过 itms-services 协议 来让用户可以直接在网页上安装测试应用。但是这...
对《iOS开发进阶》一书的解释
《iOS开发进阶》虽然仅仅在互动出版社可以买到,还没有在京东和亚马逊上架,但是在 v2ex 上已经引起了一些讨论和误解,见 此贴。所以我想在这里,对本书的内容和定位做一些解释。 定位《iOS开发...
我是如何完成《iOS开发进阶》的编写的?
前言《iOS 开发进阶》 终于出版了,在架构师峰会的签售会上,首批 100 本图书在签售的两天很快就卖光了,前几天首先在互动出版社上架的首批图书也在一天内卖缺货了,能得到读者这么热烈地支持,我还...
解读2014之iOS篇:拥抱变化
版权说明本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。 前言对于 iOS 技术领域,2014 年是变化巨大的一年。在硬件上,由于苹果发布了更大...
2014年个人总结
2014 年对于我来说是重要的一年,因为一方面我刚好年满 30 岁了,另一方面我的家庭生活和工作都经历了很大的变化。值得总结的包括: 通过分享,进一步提高了自己的技术影响力 创业进一步取得成绩...
《iOS开发进阶》即将出版
关注我博客的人也许发现了,除了每周一期的InfoQ约稿的《iOS开发周报》,我已经很久没有写iOS方面的原创文章了。这主要的原因是:我把周末的时间都用来筹划一本iOS方面的书,这本书叫做《iOS...
开源一个Key-Value存储工具类
前言还记得大学刚学数据库那会儿,天真地以为世界上所有的存储都需要用数据库来做。后来毕业后,正值NOSQL流行,那时我在网易参与了网易微博的开发,我们当时使用了有道自己做的“BigTable”— ...
写在创业两周年
一年前写了一篇名为 《写在创业一周年》 的文章,眼看创业已经两年多了,我就寻思着是不是再写一个创业两周年的总结。之所以拖了几个月,一是因为刚刚满两年的时候,我们公司刚刚拿下了 1500 万美元的...
适合码农工作时玩的游戏:Scrum
前言昨天遇到一个来自微软的面试者,在面试的最后,我简单介绍了一下我们团队使用一周一次的 Scrum 来做项目管理。他回答说:” 我在微软也用 Scrum,不过我们一周两次,时间在周二和周四上午,...
iOS开发如何提高
许多人在博客和微信上咨询我 iOS 开发如何提高,经过一番思考之后,我能想到如下一些提高的办法,我个人也是通过这些方法来提高的。 阅读博客在现在这个碎片化阅读流行的年代,博客的风头早已被微博...
WWDC2014,苹果的“软件”发布会
在今年的 6 月 2 日到 6 日,苹果照例举行了一年一次的全球开发者大会(World Wide Developer Conference,简称 WWDC)。由于去年大会门票在不到 2 分钟...
那些好用的iOS开发工具
版权说明本文首发于《程序员》杂志 2014 年 6 月刊,未经允许,请勿转载。 前言从苹果发明 iPhone 起,AppStore 上的一个又一个类似 flappy bird 的一夜暴富的故...
专访《iOS测试指南》作者羋峮
版权说明本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。 前言在 2014 年 QCon 北京 大会上,羋峮进行了他的新书 《iOS 测试指南》...
深入理解Tagged Pointer
版权说明本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。 【摘要】:为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念。对...
用CocoaPods做iOS程序的依赖管理
文档更新说明 2012-12-02 v1.0 初稿 2014-01-08 v1.1 增加设置 ruby 淘宝源相关内容 2014-05-25 v2.0 增加国内 spec 镜像、使用私有 p...
技术人员如何坚持写作
我和朋友的故事这个月我给 InfoQ 网站、《程序员》 的投稿所获的稿费,加上去人人网分享技术所得到的礼物,一共有将近 3000 块。看到这个数字之后我自己都吓了一跳,不知不觉中,写作和分享...
iOS应用安全开发概述
【摘要】:iOS 应用由于其直接运行在手机上,相比运行在服务器的后台服务,更有可能被黑客攻击。本文将从网络安全、本地文件和数据安全、源代码安全三个方面,阐述 iOS 应用在安全性上遇到的挑...
专门针对越狱iOS设备的盗号木马出现
关于木马今天,国外的 iOS 开发者 @iOn1c 发现一个来自中国的开发者 “WANG XIN” 签名的 iOS 平台的木马插件,该插件是一个名为Unflod.dylib动态链接库,可以将...
从 Facebook 看移动开发的发展
从 Facebook 谈起Facebook 最近绝对是互联网界的新闻明星。它首先是进行了大手笔的收购:2014 年 2 月,Facebook 以 160 亿美元现金加股票,以及 30 亿美元...
Mac重装记录
前言上次将我的iMac硬盘换成SSD后,我是通过迁移助理将我的Mac Book Air的环境同步过去的,不知道为什么,半个月前出现了重启后电脑一直处于加转中的状态。尝试过了网上提供的以下方法都没...
NSNumber对象缓存以及Tagged Pointer
这是一次和 @onevcat 的技术讨论总结。技术点比较散,但是还都比较有意思。涉及的技术细节包括: 系统对象的缓存 Tagged Pointer对象 讨论一:autorelase对象按照苹...
使用brew cask来安装Mac应用

简介

brew cask 是一个用命令行管理 Mac 下应用的工具,它是基于 homebrew 的一个增强工具。

homebrew可以管理 Mac 下的命令行工具,例如imagemagick, nodejs,如下所示:

brew install imagemagick
brew install node

而使用上brew cask之后,你还可以用它来管理 Mac 下的 Gui 程序,例如qq, chrome, evernote等,如下所示:

brew cask install qq
brew cask install google-chrome
brew cask install evernote

ReactiveCocoa - iOS开发的新框架

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

什么是 ReactiveCocoa

ReactiveCocoa(其简称为 RAC)是由 Github 开源的一个应用于 iOS 和 OS X 开发的新框架。RAC 具有函数式编程和响应式编程的特性。它主要吸取了 .Net 的 Reactive Extensions 的设计和实现。

ReactiveCocoa 试图解决什么问题

经过一段时间的研究,我认为 ReactiveCocoa 试图解决以下 3 个问题:

  1. 传统 iOS 开发过程中,状态以及状态之间依赖过多的问题
  2. 传统 MVC 架构的问题:Controller 比较复杂,可测试性差
  3. 提供统一的消息传递机制
自己动手给iMac换SSD

公司的 iMac 是 2011 年款的,经过 2 年的使用,现在已经变得比较慢了,用htop看了一下,其实 cpu 占用率一直不高,主要是磁盘 IO 比较慢,所以考虑自己动手给 iMac 换一个 SSD。在此将整个过程分享给大家。

非换行空格在CoreText排版上的问题

分享一个在使用 Core Text 时遇到的问题。

问题描述

我们的猿题库界面因为有图片、公式需要混排,所以用的是 Core Text 实现的排版。

在使用中,发现一些英文题目的换行方式不对,
我们设置的是按单词换行,但是总是有些题目的换行并不是按单词的,造成显示上比较错乱,如下图所示。图中 unchangeable, study, falls 三个单词都被生生截断了,造成阅读上的不适。

作为码农,我们为什么要写作

在程序员这个行业,坚持做技术写作的人一直比较少。我和身边的朋友沟通后,发现他们除了借口没有时间外,大多没有意识到写作带来的收益。在他们看来,将自己学到的知识简单记录下来就足够自己需要的时候回顾了。而技术写作通常需要花更多时间,因为需要将技术的细节以及来龙去脉讲清楚。

不得不承认,这的确是一个事实,通常情况下,把一个知识讲清楚比理解它更难。那我们为什么要花时间写作呢?我想写作至少有以下好处。

2013年个人总结

2013这一年值得总结的有两方面的事情:一是技术分享和收获,二是创业感悟。

技术分享

我这一年在技术分享上投入了更多的时间,也得到了非常大的收获。

我主要的技术分享渠道包括:

  1. 个人博客。今年一共完成了24篇原创博客。相比于去年的36篇,少了很多。主要是因为很多精力分散到微信公共帐号上去了。不过今年文章的质量相比去年更高了,写了包括《Objective-C对象模型及应用》《谈Objective-C Block的实现》这类比较深入的文章。

  2. InfoQ网站 。今年一共完成了7篇发表在InfoQ 上的稿件 , 其中原创技术文章4篇,翻译技术新闻1篇,采访稿2篇。

如何写面向互联网公司的求职简历

前言

我在 IT 公司工作了六年,有着三年面试官的经历。在面试中,我发现很多人都不能写好一份求职简历,所以今天不谈 iOS 开发,谈谈如何写一份针对互联网公司的求职简历。

我主要想分享的内容包括:

  • 简历的页数不要超过两页(最好一页)
    • 删掉不必要的信息
    • 如果你实在太牛逼,最多写 2 页
  • 重要的信息写在最前面
    • 你的联系方式
    • 你最重要的工作经历
  • 不要简单罗列工作经历
    • 列出你的工作中有价值的细节(有哪些技术上的困难等)
  • 不要写任何虚假或夸大的信息
    • 类似精通 java,精通 C/C++ 等
  • 不要附加任何可能带来负面印象的信息
    • 不要加照片
    • 不要写政治面貌
    • 不要写奇怪的爱好(打游戏,喝酒,抽烟)
    • 不要写参加过某某培训公司的 iOS 培训
    • 尽量用专业邮箱
    • 用 PDF 格式
Xcode Debugger中的Icon符号的意义

你注意到了吗?在 Xcode 中,当你点击查看调用栈的时候,调用栈的每个方法前面都有一个 Icon,而且还有好几种不同的样子,如下图所示,你知道它们代表什么意思吗?

iOS开发工具-网络封包分析工具Charles

更新

本部分的内容写于2013年12月,2015年11月有更新,更新版的文章见:《Charles 从入门到精通》

简介

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

Charles 是在 Mac 下常用的截取网络封包的工具,在做 iOS 开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。

Charles 是收费软件,可以免费试用 30 天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过 30 分钟,并且启动时将会有 10 秒种的延时。

因此,该付费方案对广大用户还是相当友好的,即使你长期不付费,也能使用完整的软件功能。只是当你需要长时间进行封包调试时,会因为 Charles 强制关闭而遇到影响。

Charles 主要的功能包括:

  1. 支持 SSL 代理。可以截取分析 SSL 的请求。
  2. 支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。
  3. 支持 AJAX 调试。可以自动将 json 或 xml 数据格式化,方便查看。
  4. 支持 AMF 调试。可以将 Flash Remoting 或 Flex Remoting 信息格式化,方便查看。
  5. 支持重发网络请求,方便后端调试。
  6. 支持修改网络请求参数。
  7. 支持网络请求的截获并动态修改。
  8. 检查 HTML,CSS 和 RSS 内容是否符合 W3C 标准
使用Flurry来统计和分析用户行为

2015年11月更新

由于 Flurry 的后台在中国访问实在太慢,另外 Flurry 对中国区的 IP 类型判断不太准确(3G和Wifi无法准确区分),所以我现在不再推荐大家使用 Flurry 了。

不用 Flurry 之后,我们现在使用的是腾讯的 MTA 来做统计。

简介

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

Flurry是一家专门为移动应用提供数据统计和分析的公司。他们的数据统计分析SDK支持的平台包括iPhone, iPad, Android, Windows Phone, Java ME和BlackBerry。使用Flurry服务的公司包括eBay、Yahoo、Hulu和Skype等超过11万家公司,涉及的应用超过36万个。

利用Flurry提供的分析平台,我们可以很容易地自动统计出应用的使用情况,例如:

  1. 每天(每周或每月)登录用户数,应用使用次数
  2. 每天(每周或每月)新用户数,活跃用户数
  3. 用户的所在地、年龄、性别的分布情况

Flurry也可以自动统计出移动设备的分类情况,例如:

  1. 使用3G,Wifi的会话比例
  2. 使用iOS系统各版本(例如iOS6.0, iOS7.0等)的比例
  3. 使用iOS各种设备(例如iPhone4, iPhone5等)的比例

除了上面介绍的自动统计项目,Flurry SDK也提供了统计用的相关API,便于我们针对自己产品的特点,做针对性的统计。例如统计应用中某个按钮的按下次数,或者网络请求的平均响应时间等。

猿题库iOS客户端的技术细节(二):答题卡扫描算法

前言

本人今年主要在负责猿题库 iOS 客户端的开发,本文旨在通过分享猿题库 iOS 客户端开发过程中的技术细节,达到总结和交流的目的。

这是本技术分享系列文章的第二篇。本文涉及的技术细节是:答题卡扫描算法。

猿题库iOS客户端的技术细节(一):使用多target来构建大量相似App

前言

本人今年主要在负责猿题库 iOS 客户端的开发,本文旨在通过分享猿题库 iOS 客户端开发过程中的技术细节,达到总结和交流的目的。

这是本技术分享系列文章的第一篇。本文涉及的技术细节是:采用多 Target 编译方案来实现多个相似 App 的开发,以保证我们能够快速地推出多个相似课程的客户端。

Objective-C对象模型及应用

前言

原创文章,转载请注明出自 唐巧的技术博客

本文主要介绍 Objective-C 对象模型的实现细节,以及 Objective-C 语言对象模型中对isa swizzlingmethod swizzling的支持。希望本文能加深你对 Objective-C 对象的理解。

ISA 指针

Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。在 Objective-C 语言的内部,每一个对象都有一个名为 isa 的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。

在 XCode 中按Shift + Command + O, 然后输入 NSObject.h 和 objc.h,可以打开 NSObject 的定义头文件,通过头文件我们可以看到,NSObject 就是一个包含 isa 指针的结构体,如下图所示:

动态下载苹果提供的多种中文字体

引言

在今年 WWDC 的内容公开之前,大家都以为 iOS 系统里面只有一种中文字体。为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件。但自己打包字体文件比较麻烦,原因在于:

1、字体文件通常比较大,10M - 20M 是一个常见的字体库的大小。大部分的非游戏的 app 体积都集中在 10M 以内,因为字体文件的加入而造成应用体积翻倍让人感觉有些不值。如果只是很少量的按钮字体需要设置,可以用一些工具把使用到的汉字字体编码从字体库中抽取出来,以节省体积。但如果是一些变化的内容需要自定义的字体,那就只有打包整个字体库了。

2、中文的字体通常都是有版权的。在应用中加入特殊中文字体还需要处理相应的版权问题。对于一些小公司或个人开发者来说,这是一笔不小的开销。

以上两点造成 App Store 里面使用特殊中文字库的 iOS 应用较少。现在通常只有阅读类的应用才会使用特殊中文字库。

但其实从 iOS6 开始,苹果就支持动态下载中文字体到系统中。只是苹果一直没有公开相应的 API。最终,相应的 API 在今年的 WWDC 大会上公开,接下来就让我们来一起了解这个功能。

谈Objective-C block的实现

前言

这里 有关于 block 的 5 道测试题,建议你阅读本文之前先做一下测试。

先介绍一下什么是闭包。在 wikipedia 上,闭包的定义 是:

In programming languages, a closure is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local variables (also called free variables or upvalues) of that function.

翻译过来,闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。

block 实际上就是 Objective-C 语言对于闭包的实现。
block 配合上 dispatch_queue,可以方便地实现简单的多线程编程和异步编程,关于这个,我之前写过一篇文章介绍:《使用 GCD》

本文主要介绍 Objective-C 语言的 block 在编译器中的实现方式。主要包括:

  1. block 的内部实现数据结构介绍
  2. block 的三种类型及其相关的内存管理方式
  3. block 如何通过 capture 变量来达到访问函数外的变量
分析支付宝客户端的插件机制

前言

因为开了 iOSDevTips 的微信公共账号,老收到各种 iOS 开发的问题,前两天收到一个问题的内容是:

请问像支付宝钱包那样可以在应用里安装自己的应用,是已经在应用里写了逻辑,还是可以向应用里发送代码 ?

我觉得这个问题挺有意思的,估计大家都感兴趣,所以今天就抽空研究了一下,将支付宝客户端的插件机制具体实现方式介绍给大家。

先介绍一下该插件机制,如上图所示,支付宝客户端在安装后,对于像 “彩票”、“爱心捐赠” 这类功能,需要再点击安装一次,然后才可以使用。有些时候该插件功能进行了升级,需要点击升级才可以继续使用。插件的方式有利于软件动态增加新的功能或升级功能,而不用再一次向 AppStore 提交审核。另外,由于用户不需要的插件可以不用安装,也缩小了应用本身的体积大小,节省了下载流量。

写在创业一周年

前言

大约在去年这个时候,我离开网易有道,开始了自己的创业不归路。一年过去了,总是在忙碌,在最忙的时候,我连博客都没有时间更新了。但是这一年的经历对我的成长重大,还是挺值得写下来的,在此将我的故事分享给那些一同走在创业路上的朋友。

iOS开发工具篇-AppStore统计工具

本文首发于 InfoQ,本文版权归 InfoQ 所有,转载请保留 原文链接

前言

随着 iOS 开发的流行,针对 iOS 开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具。这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Google Analytics 等), App Store 销售分析工具(例如 App annie), App crash 收集工具(例如 Crashlytics),App 测试发布工具(Test Flight), App Push 服务等。

这些解决方案或工具节省了 iOS 开发者大量的开发时间,但是由于相关介绍文章的缺乏,许多开发者都在重复着自己一次又一次重新造轮子。所以我希望,将我自己使用和调研的相关的第三方服务使用经验,整理成一系列文章,以便广大开发者能够省去大量的重复性工作。

今天介绍 AppStore 统计工具:App Annie 和苹果的命令行统计工具。

Git submodule的坑

前言

随着近几年的发展,Git 已经成为开源界的标准的版本控制工具。开源界的重量级项目,如 Linux, Android, Eclipse, Gnome, KDE, Qt, ROR, Debian,无一例外的都是使用 git 来进行版本控制。如果你还不会 Git,那么恕我直言,你已经 out 了,赶紧抽空充充电吧。本文并不打算做 Git 入门级介绍,想学习 git 的同学,推荐国内作者蒋鑫写的 《Git 权威指南》

对于一些比较大的工程,为了便于复用,常常需要抽取子项目。例如我开发的猿题库客户端现在包括 3 门考试,客户端涉及的公共 UI、公共底层逻辑、公共的第三方库、以及公共的答题卡扫描算法就被我分别抽取成了子项目。这些子项目都以 git submodule 的形式,增加到工程中。

在使用了 git submodule 一段时间后,我发现了一些 submodule 的问题,在此分享给大家。

历史上的WWDC门票售空图片
2008年62天售空。介绍了iPhone 3G。 2009年33天售空。介绍了iPhone 3GS。 2010年8天售空。介绍了iPhone 4。 2011年12小时售空。介绍了iO...