唐巧的博客

唐巧的博客

记录下自己学习的点滴

让Xcode的 stack trace信息可读

昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个 main 函数的入口处:

int main(int argc, char *argv[])
{
@autoreleasepool {
// 异常停在了下面这行,毫无提示作用
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyClass class]));
}
}
改进iOS客户端的升级提醒功能

功能设计

先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 “升级提示功能” 都不太友好。在此分享一下我的想法,欢迎大家讨论。

这些 App 包括:新浪微博、网易微博、网易新闻客户端以及大部分带有升级提示功能的 App,所以我觉得这个问题还是挺普遍的。对于该问题,一句话描述起来就是:“这些 App 都会在用户刚刚使用它的时候,提示有新版本,让用户去 AppStore 上下载最新的版本”。下面是某个应用的升级提示截图:

为什么我认为这是一个糟糕的设计呢?因为用户刚刚打开你的 App,明显就是想使用你的功能。例如刚刚打开新浪微博,可能就是想看一下最新的消息或回复。刚刚打开网易新闻客户端,可能就是想看看最新的新闻。这个时候,你告诉用户有新版本,是想让用户暂时放弃使用该 App 吗?我不知道有多少用户会去点 “升级” 这个按钮,反正我每次看到这个提示都很郁闷,因为我如果点了,我就暂时不能使用该应用了(升级时原版本的 App 是无法使用的)。所以我在想,这个提示升级的时间能不能做得更友好一些?

在MacOS和iOS系统中使用OpenCV

前言

OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。

最近试着在 MacOS 和 iOS 上使用 OpenCV,发现网上关于在 MacOS 和 iOS 上搭建 OpenCV 的资料很少。好不容易搜到些资料,却发现由于 OpenCV 和 Xcode 的版本更新,变得不再有用了。有些问题费了我很多时间,在此总结分享给大家,希望后来人少走些弯路。

可以预见到,随着 Xcode 和 OpenCV 的版本更新,本文可能不再有效了。

所以特此注明,文本介绍的搭建方法仅针对于 Xcode4.5.1 和 OpenCV 2.4.2 版本。

(2013-6-22)更新: 我在 Xcode4.6.2 和 OpenCV 2.4.5 版本的时候重新进行了一次环境搭建,以下内容做了相应调整,应该也是有效的。

粉笔网的架构和项目管理
10 月 10 日,在 CMDN 炫姐姐 的邀请下,我们粉笔网团队通过 CSDN 的 CMDN Club, 对外进行了第一次 技术分享。分享的内容主要包括 2 部分: 第一部分是关于粉笔网使用 ...
让你的APP支持iPhone5

前言

国庆节前,为了支持 iPhone5 的屏幕分辨率 (640 象素 x 1136 象素),我尝试着升级粉笔网 iPhone 客户端。整个过程花了大概一天的时间,我把这个过程总结下来,希望对大家有帮助。

谈谈我的创业感受

5 个程序员,3 个多月时间,30 多万行代码,1000 个 bug,只为打造卓越产品。

开发历程

先简单介绍一下产品。我们的产品叫 “粉笔网”,这是一个新颖的学习社区。我们公司的创始人是前网易高管 李勇。我们团队从 4 月份开始筹备,5 月份开始工作,整个开发历经 3 个多月,其中网站于 8 月 28 号顺利上线,iPhone 客户端Android 客户端 于 9 月 8 日顺利通过审核上线。

用脚本来简化iOS美术同学的工作

问题

我们知道,在 iOS 开发中,为了使我们的 app 能够同时支持 iPhone 的 Retina 屏幕和普通屏幕,美术同学需要对 UI 设计稿中的每个元素进行 2 次切图。苹果要求对图片元素的命名分别为 name.png 和 name@2x.png,带 @2x 的表示是 Retina 屏幕的贴图,不带 @2x 的同名文件为普通屏幕的贴图。

我在开发的时候发现很难要求美术同学按照开发的要求来对图片命名。她们通常对于切图的命名是例如 * 登录按钮大 .png* ,* 登录按钮小 .png, * 登录按钮按下大 .png * 登录按钮按下小 .png* 这样的形式。于是,对这些文件按照苹果的要求进行重命名就成了我这个码农的一个体力活。

Objective-C的新特性

苹果在今年的 WWDC2012 大会上介绍了大量 Objective-C 的新特性,能够帮助 iOS 程序员更加高效地编写代码。在不久前更新的 Xcode4.4 版本中,这些新特性已经可以使用了。让我们看看这些新特性有哪些:

封装同步的UIActionSheet

问题

做 iOS 开发的同学想必都用过 UIActionSheet。UIActionSheet 可以弹出一个选择列表,让用户选择列表中的某一项操作。使用 UIActionSheet 非常简单,以下是一个简单的示例代码:

- (void)someButtonClicked {
UIActionSheet * sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"ddd" destructiveButtonTitle:@"aaa" otherButtonTitles:@"bbb", @"ccc", @"ddd", nil];
sheet.destructiveButtonIndex = 1;
[sheet showInView:self.view];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
int result = buttonIndex;
NSLog(@"result = %d", result);
}

但我个人在使用时,感觉 UIActionSheet 有以下 2 个问题:

不要使用SBJSON(json-framework)

不知道为什么,在iOS开发中,有很多人使用 SBJSON (又被称作json-framework)来做JSON解析库。我想这是因为SBJSON是最早在iOS上出现的JSON解析库。但是随着iOS开发的流行,越来越多优秀的JSON解析库也涌现出来, SBJSON和它们相比,性能上有很大的差距。

在iOS开发中使用FMDB

前言

SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的 SQLite API 在使用上相当不友好,在使用时,非常不便。于是,开源社区中就出现了一系列将 SQLite API 进行封装的库,而 FMDB (https://github.com/ccgus/fmdb) 则是开源社区中的优秀者。

关于iOS测试机个数上限的详细规则

2016.02.16 更新

关于测试机上限的规则苹果有变更,本文中的内容有一些陈旧。

前言

公司的iOS测试机快达到苹果规定的100个上限了,而因为the new iPad新出,我们需要新的quota来测试新iPad,所以就仔细研究了一下苹果关于100个测试设备上限的规则。在这里分享给大家。规则的详细内容主要来自 苹果的官网文档

关于UIWebView的总结

前言

今天参加了 Adobe 和 CSDN 组织的一个关于 PhoneGap 的开发讲座 ,而 PhoneGap 在 iOS 设备上的实现就是通过 UIWebView 控件来展示 html 内容,并且与 native 代码进行交互的。

正好我们在做有道云笔记的 iPad 版,因为我们也是使用 UIWebView 来展示笔记内容,所以也需要做 js 与 native 代码相互调用的事情。所以在这儿顺便总结一下 UIWebView 在使用上的细节,以及谈谈我对 PhoneGap 的看法。

iPhone开发常问的十个问题(2012年3月版)

前言

今天去stackoverflow.com上看了一下iPhone标签下排名最高的10个问题,将它们整理出来,希望这些常见问题能帮到一些iPhone开发的初学者。本来想把答案也翻译过来的,后来发现答案资料通常都比较复杂,翻译起来太麻烦。所以大家还是看英文的答案吧,我只顺带用中文总结一下答案。

Xcode4 使用技巧

使用 xcode4 也有一段时间了,今天整理了一下 xcode4 的一些使用技巧,在这里分享给大家。

用Git进行协同开发

问题场景描述

常常会遇到这样的协同场景:后台的同事和前端的同事需要共同开发一个新功能,而他们的代码相互依赖,所以需要不停地更新各自的代码进行联调。

对于这种场景,最简单的方式就是,这 2 个同事坐到一起,然后把 svn 当作一个共享代码的中转站来共享开发中的代码。

在这种方式下,大家各自写自己的代码,提交到 svn 上,然后用 svn up 获得对方的代码。在调试问题的时候,大家可能不停地更新代码,然后让对方用 svn up 来更新。最终,虽然开发能够顺利进行,但是 svn 上会积累大量调试中的代码历史。所以,这样把 svn 当作代码中转站是一个很山寨的行为。

在开发 有道云笔记 新的 iPad 版 时,我和前端同事 zyc 尝试用 git 进行了协同开发。在这里把具体方案分享给大家,欢迎大家讨论。

使用GCD

什么是 GCD

Grand Central Dispatch (GCD) 是 Apple 开发的一个多核编程的解决方法。该方法在 Mac OS X 10.6 雪豹中首次推出,并随后被引入到了 iOS4.0 中。GCD 是一个替代诸如 NSThread, NSOperationQueue, NSInvocationOperation 等技术的很高效和强大的技术。

GCD 和 block 的配合使用,可以方便地进行多线程编程。

给iOS工程增加Daily Build

前言

Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 “持续集成” 的一个实践。Daily Build 对于开发来说有如下好处:

  • 保证了每次 check in 的代码可用,不会造成整个工程编译失败。
  • 进度跟进。产品经理可以每天看到最新的开发进度,并且试用产品,调整一些细节。很多时候,一个新功能,你真正用了一下才能有体会好或不好,所以 daily build 也给产品经理更多时间来调理他的设计。
  • 需求确认。产品经理可以确认开发的功能细节是他的预期。因为我们的开发比较紧凑,所以都没有传统的需求说明文档,所以 daily build 也给产品经理用于尽早确认开发的功能细节是他的预期,我就遇到一次产品经理发现开发出的一个功能细节和他的预期不一致,但是因为有 daily build,使得我可以尽早做修改,把修改的代价减小了。
  • 测试跟进。如果功能点是独立的话,测试同事完全可以根据 daily build 来进行一些早期的测试。越早的 Bug 反馈可以使得修改 bug 所需的时间越短。
给NSString增加Java风格的方法

我实在受不了 NSString 冗长的方法调用了,每次写之前都要查文档。特别是那个去掉前后多余的空格的方法,长得离谱。与之对应的别的语言,拿 java 来说,对应的方法名叫 trim。拿 python 来说,对应的方法名叫 strip。但是 Objective-C 呢?是下面这段:

[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
avatar
唐巧
一个中年程序员,正在努力学习做业务