Archiv

灵活运用 Xcode 给项目添加不同的编译时配置

在开发过程中经常会需要定义一些常量,希望在编译生成不同版本时用不同的值。比较常见的一种做法是根据是否定义了 DEBUG 宏来定义不同的常量值,对于 debug 的版本使用 debug 的常量值,对于 release 的版本则使用 release 的常量值。如下所示:

#if DEBUG
#define DefaultBaseURL @"http://xxx.xxx.xxx.xxx"
#else
#define DefaultBaseURL @"http://aaaa.aaa.aaa"
#endif

但这些都要定义在代码中,如果能定义在 plist 配置文件中就更好了。而且如果除了 debug 和 release 之外还有其他的版本需要定义不同的常量值呢?甚至如果要在编译时根据不同的版本使用不同的 Bundle ID 呢?很明显上面的方法是无法解决这些问题的。

iOS 线程池使用实践

概述:

这个标题也许有点大了,正确地来说这篇文章主要是讲使用NSOperation和NSOoperationQueue来完成一个较为灵活的线程池实践。
线程池这个概念也是相当大的,这里只谈谈我对线程池的狭义的理解:线程池主要是通过减少线程的创建/销毁,重用现有的资源来提高性能的一种机制,调用者把任务投放到线程池的任务队列中,线程池根据调度算法从任务队列中取出任务放到空闲线程中执行,如此一直反复循环。而根据不同的业务需求,还可以对线程池的任务队列的控制、调度算法、线程池的初始化、线程的生命周期等方面进行优化,从而可以使线程池的性能达到最大化。线程池适合于多个任务同时执行,而这些任务都是短时间内完成的,而不是长期性的。

调用一个动态获得的 Class 的初始化 protocol 实例方法

问题

标题有点绕,其实就是把:

  1. 通过 runtime 根据字符串获得某个 Class,用这个 Class 创建且初始化一个实例。
  2. 某个类实现了一个 protocol,这个 protocol 定义了某个自定义的 init 方法,创建出来的实例需要通过这个 init 方法来初始化。

这两种需求结合在一起。准确来说就是通过 runtime 获得了一个实现了某个 protocol 的 Class,现在创建这个 Class 的一个实例并且调用 protocol 的 init 方法来初始化。上面两个需求,单独一个都能很简单地完成,然而结合在一起之后就不是那么简单了。

在 Core Data 中存取 transformable 类型的数据

在开发过程中有一个需要在 Core Data 中存取 NSDictionary 的需求,但是在 Core Data 的 attributeType 中并没有直接支持 NSDictionary 的类型,基本上就是一些 scalar 类型和 date、binary data、undefined 和 transformable 类型。

最初的想法是把 NSDictionary 转为 NSData 然后用 binary data 的类型写入到 Core Data,然后要用的时候再从 Core Data 中读出 NSData,再转回 NSDictionary,但是想想这样其实也挺麻烦的,想看看 Core Data 有没有更好的对这类需求的支持,这个方法就作为最后的手段来使用吧。于是在扫了一遍 Core Data 的 attributeType 之后就盯上了 transformable 这个类型。

解决 OS X 10.10 下运行 brew 命令时出现的错误

自从升级到 Yosemite 后就没用过 brew 命令了,今天想要 search 某个包,但是在 Command Line 运行 brew 命令后就显示下面的错误信息:

1
2
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 23: /usr/local/Library/brew.rb: Undefined error: 0