用CommonCrypto计算MD5和SHA

标签:Objective-C

编程时经常需要和MD5、SHA等hash算法打交道,搜了一下后我发现iOS SDK中自带了CommonCrypto,于是就无需自己实现或用第三方库了。

获取iOS设备的内存状况

标签:iOS开发

由于iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。
不过iOS SDK文档里并没有提及这种底层的API,于是我搜了一番,找到了host_statistics()这个函数。

自定义iPhone的状态栏

标签:Objective-C, iOS开发

用过Reeder的应该都会发现,在进行同步时,右上角会出现一个自定义的图标。而在点击它时,就会向左扩张覆盖住原状态栏,并显示同步状态。
这个设计非常巧妙,因为传统的设计在显示状态时,往往会占用掉几十像素;而在阅读时,用户非常希望主要内容能占据更多的空间。
那么这个设计是怎么实现的呢?下面就来模拟一下。

Objective-C的消息传递机制

标签:Objective-C

各种语言都有些传递函数的方法:C语言中可以使用函数指针,C++中有函数引用、仿函数和lambda,Objective-C里也有选择器(selector)和block。
不过由于iOS SDK中的大部分API都是selector的方式,所以本文就重点讲述selector了。

关于Core Animation的一些初步探索

标签:Objective-C, iOS开发

所谓Core Animation,顾名思义就是用来做动画的,它包含了一些Objective-C类,这些类都在Quartz Core框架中。
用它的原因也无需多说,首先是性能很好,使用了GPU硬件加速;其次是接口易用,毕竟是Objective-C,不需要像OpenGL ES一样完全和C打交道。
不过要掌握它也很费劲,这2天就遇到了不少问题,于是记录在此。

让ASIHTTPRequest不占用主线程

标签:Objective-C, iOS开发

ASIHTTPRequest是个很易用的iOS / Mac OS X平台的HTTP库,比NSURLRequest好用多了,所以我一直在用它。
不过使用中我发现,当下载线程数超过2时,就会影响到主线程响应用户请求的速度了。好奇之余我测试了一下completionBlock,发现它总是在主线程调用,而NSOperation的文档中却说一般会在子线程中执行。

优化UITableView性能

标签:Objective-C, iOS开发

在iOS应用中,UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、天气、照片、电话、短信、Safari、App Store、iTunes、Game Center⋯几乎所有自带的应用中都能看到它的身影,可见它的重要性。
然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时。
实际上只要针对性地优化一下,这种问题就不会有了。有兴趣的可以看看LazyTableImages这个官方的例子程序,虽然也要从网上下载图片并显示,但滚动时丝毫不卡。
下面就说说我对UITableView的了解。不过由于我也是初学者,或许会说错或遗漏一些,因此仅供参考。

迟到的2011 ChinaJoy游记

标签:ACG

上周六又去逛了下ChinaJoy,这也是我在上海的惯例了。不过由于太累,日志也就拖到今天才放出了,不过Google+上都已经都放过了。看不到图的自行翻墙,其实改hosts即可。

利用预渲染加速iOS设备的图像显示

标签:Objective-C, iOS开发

最近在做一个UITableView的例子,发现滚动时的性能还不错。但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感。
于是我猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如此。
后来在《Improving Image Drawing Performance on iOS》一文中找到了一些提示:原来在显示图像时,解压和重采样会消耗很多CPU时间;而如果预先在一个bitmap context里画出图像,再缓存这个图像,就能省去这些繁重的工作了。

GAE SDK 1.5.2版发布

标签:Google App Engine

今早起来发现GAE SDK 1.5.2版发布了,不过工作太忙就无暇顾及了,于是现在补上更新列表:

  • 可以在管理员控制台的Application Settings页面里设置最大空闲实例数和最小等待时间。
  • 索引中有重复字段的不会再报索引爆炸的警告。
  • SDK支持并行的数据库事务。
  • Datastore的stats API支持按namespace查询。
  • 管理员控制台的Task Queues页面可以显示请求头、过去的运行信息和任务的payload。
  • Pull queue可以用modify_task_lease()来修改lease(租期和任务数)。
  • Pull Task的最大尺寸增加到1MB。
  • 可用appcfg.py的"backend configure"指令来修改backend instances数目,而无需先停止instances。
  • Mail API可设置References和In-Reply-To头。
  • SDK的APPLICATION_ID环境变量将含dev~前缀。获取app id的推荐方式是用appidentity.get_application_id()。可以使用--default_partition参数来修改这个前缀(后面会附加一个“~”符号)。
  • Deferred API的defer()可接收_target参数,用于指定应用的version或backend。
  • db.Model增加to_dict()实例方法。
  • Images API增加get_original_metadata()方法来获取图像的EXIF信息。
  • db.py增加@transactional装饰器,用于标注一个函数用于执行事务。

此外,Go SDK的进展很慢,看上去还是个玩具…

« 看看还有什么好玩意