第九块石头

分段读取任何编码文本

| Comments

世界上的字符编码多得眼花缭乱,而且绝大部分都是不定长的编码。要跳到一个巨大文本文件的第n个字符就必须从0开始一个一个地分析字符,数到n为止;又或者整个文件导入,让系统把文件里的数据转成string,再在string里获得第n个字符。

不过,本文也没法解决上面那个问题,上面只是想说明据我所知,把文本文件转成字符串的方法只有:

  1. 一个一个分析,分析一段后让系统API转成字符串;
  2. 整个文件导入,转成字符串的工作让API来完成。

第一种方法非常复杂,我想也没有很多人认识所有字符编码;第二种方法遇到巨大的文件的时候非常耗内存。

前几天我想到了一个折中的方法,它可以一小段一小段地读入文本,利用的是文本里的特殊字符。方法如下:

首先要知道文本的编码(这里以SHIFT-JIS为例),除了UTF8和有BOM的文本,其余的一般很难能够直接从文本里分析出它的编码。

还要知道文本的特征,比如是小说的话肯定会有换行符(这里以换行符为例)。

获得换行符用SHIFT-JIS表示的bytes。

用binary的方式读入文件,遇到换行符的bytes就截断(太短的话还可以稍微改进一下),把获得的那一串字节用系统API转换成字符串。 重复这个步骤,读到不想读为止。

`

在已经存在的iOS项目中集成OCTest

| Comments

创建新项目的时候,我们都能勾选单元测试那个选项,但是往往在iOS都没有写单元测试的习惯,所以经常不勾这个勾。今天突然需要往原来没单元测试的项目里面添加OCTest,google了一下,还挺麻烦的说……

首先添加一个Target,随便取个名字,例如unitTests,在Build PhasesTarget Dependencies里面添加需要测试的项目:

Build Settings–>Bundle Loader,设置为$(BUILT_PRODUCTS_DIR)/待测试的Target名称.app/待测试的Target名称

MacOS安装Cocoapods步骤

| Comments

Cocoapods本身就是ruby的一个gem,所以没啥特殊的安装方式,但是很多iOS或者OSX开发人员都对ruby不熟悉,所以简单的总结一下。

分为一下几步骤:

  1. 安装Command Line Tool (CLT)
  2. 安装Homebrew
  3. 安装rvm
  4. 安装ruby
  5. 安装cocoapods

好像要装不少东西……其实都是一层一层的,CLT是必装的,homebrew管理一些依赖,rvm实现ruby虚拟机。已经安装有的可以跳过,也可以重新按照上面的步骤安装。

请先确保XCODE为最新版本!!!

安装Command Line Tool (CLT)

在Xcode的Preferences–>Downloads–>Components里面可以直接安装,也可以到Apple单独下载安装。

ARC对for-in语句的处理

| Comments

为了加快 for in 语句的效率, 启用了ARC的编译器不会在下面句子中 retain obj

1
for (NSObject *obj in array) { … }

下面代码:

1
2
3
4
for (NSObject *obj in array) {
     obj = nil;
}

如果编译通过,在obj = nil 时会release掉obj, 会崩溃。

为了安全,编译器不会让上面语句编译通过。 语句 for (NSObject *obj in array) { … } 不允许修改obj的值。

MAC配置文件管理

| Comments

现在我有两台MAC,一台在公司用,一台在家里用。没什么工作和娱乐的区别,两台电脑的设置基本一样,但每个东西设置两次是很麻烦的事。我的解决办法是使用网盘和软链接还有github,下面说说网盘可以做啥:

我注册了Dropbox, 快盘,Copy,SkyDrive。
Dropbox服务器在国外,速度不快,但信得过,用它存放重要文件,代码,系统配置;
快盘速度快,但资料随时可能被国家收编,只能用它存放照片,和对别人无益,对自己无害的东西;
Copy, SkyDrive,还在考虑能放什么。

我觉得比较多重复的有vim和shell的配置

对于Vim 在Dropbox文件夹下 新建个VimSetting 文件夹,关于vim的配置文件都放在里面

1
2
$ ls Dropbox/PreciousCode/VimSetting/
gvimrc     vim     vimrc

使用Bundle管理Cocoapods版本

| Comments

Cocoapods将Rails的Gem思想成功的迁移到了OSX中,让iOS和MacOS也能快速的管理第三方依赖。

然而,用久了发现一个很尴尬的问题——Cocoapods还不是很完善,因此更新频率很大,虽然我经常更新,但是他对旧版本的Cocoapods兼容性并不好。

例如,我有一个项目是用0.16版本的Cocoapods开发的,过了一段时间,需要对这个项目进行更新,在运行pod install时会出现各种问题,原因是我用新版本的pod来安装旧版本的podfile.lock,虽然官方也尽量在兼容旧版本,但不可避免还是会出现各种问题,例如——用法过期并移除……

这时候想到,进行Rails开发中,用Bundle进行Gem管理,而Cocoapods本身就是一个Gem,那能不能用Bundle来管理Cocoapods呢?

禁用 Time Machine 的本地备份存储

| Comments

所谓本地备份存储是 Lion 系统中系能的一项功能,也叫快照。简单地说,如果用户将 Time Machine 的备份磁盘设置为外置磁盘,那么 Time Machine 将自动在内置驱动器中也创建一套附加备份,以方便无法使用外置磁盘的意外情况等。这样做为备份的安全又提供了一重保障,但对于需要节省硬盘空间开支的情况而言,小硬盘的电脑可能变成鸡肋。

ARC中精确的对象生存期

| Comments

从WWDC 2012 Session 712 Asynchronous design patterns with blocks gcd and xpc 里看到的,用其它形式没有重现,暂且记下来。

代码

1
2
3
4
5
6
7
- (void)logWithData:(dispatch_data_t)data {
  void *buf;
  dispatch_data_t map;

  map = dispatch_data_create_map(data, &buf, NULL);
  NSLog(@"%@", [NSString stringWithUTF8String:buf]);
}

将会被编译为

1
2
3
4
5
6
7
8
- (void)logWithData:(dispatch_data_t)data {
  void *buf;
  dispatch_data_t map;

  map = dispatch_data_create_map(data, &buf, NULL);
  objc_release(map);
  NSLog(@"%@", [NSString stringWithUTF8String:buf]);
}

这种情况往往会造成崩溃,需要对对象的生存时间进行严格定义。

推送技术(APNS)三——客户端

| Comments

客户端基本实现很简单,只需要注册一下remote notification,然后重载几个通知状态调用函数即可.

注意事项:

  1. 模拟器无法进行APNS调试,只能在真机上调试.
  2. 真机调试时,必须选择带有APNS功能的.mobileprovision(不能是团队证书,即证书的Application Identifiers不能带有通配符