To be continued
大地春如海,男儿国是家。龙灯花鼓夜,长剑走天涯

星期三, 二月 18, 2009

直接使用Xcode生成注释和文档

好的程序一定包含文档和注释,不仅容易看懂,容易维护,也是团队沟通的基础

Xcode可以直接生成注释和文档,方法如下

1. 在.h文件中按规范声明,如声明一个函数严格按照如下格式


- (NSString*) stringForNumber:(double) f;


注意: +/-号后面一定要跟一个空格

2. 选定你要注释的函数,然后选择Xcode的菜单 [Script icon] -> HeaderDoc -> insert @method template 如图




然后代码中会生成规范的注释



于此类推,也可以生成@class, @protocol等注释

3. 有完整的注释就能生成文档,方法

在你的项目文件夹中运行


headerdoc2html -o hdoc *.h
gatherheaderdoc hdoc


便可以在hdoc文件夹中生成像Cocoa API Documents一样的文档,为了方便你可以新建一个Shell Script target,这样你能在xcode中就很方便地生成文档。



游击队也要在战斗中学习如何成为正规军,大家继续努力

星期一, 二月 16, 2009

在Xcode的iPhone项目中使用单元测试

完美的软件来自专业乃至苛刻的测试,提醒一下自己逐渐提高对自己的要求。分享一下在Xcode的iPhone项目中做单元测试的方法。iPhone SDK 2.2 开始支持使用 SenTestingKit.framework进行单元测试

第一步,新建UnitTest Target

鼠标右键点Target,Add->NewTarget



选择Cocoa Unit Test Bundle



第二步,配置 UnitTest Target
( Mac OS X 项目跳过此项,iPhone only )

因为iPhone上没有Cocoa.h, 因此删除相关的配置

1. 双击 UnitTest Target, 打开target的属性"Build'页,删除所有的User-Defined项,以及Other Linker Flags
2. 切换到 "Build" 页,添加两个Foundation.framework和SenTestingKit.framework到Unit Test Target




第三步,新建Test Cases

1. 把 /Developer/Library/SenTestingKit.framework 加入项目
2. 新建 Objective C test case classes



这是一个从SenTestCase继承的class,假设新建的文件是 MyTests.h MyTests.m, 把MyTests.m修改成如下


#import "MyTest.h"
#if !TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR

@implementation MyTest

- (void)testFooBar {
STAssertEquals (1 + 1, 2, @"");
STAssertEquals (1 + 1, 3, @"");     //明显的Test Cases错误 2<>3
}

@end
#endif


注意:如果非iPhone项目,可以不需要那个 #if 的宏,这段宏是确保 在非iPhone Simulator 的环境下 Test Cases无效,SenTestingKit.framework暂时不支持device

深入的Test Cases的写法参见这里

第四步,运行Test Cases

准确的说Test Cases不需要运行,编译的时候就运行了。尝试 Build Unit Test Target, 你会直接得到一个错误,就像编译错误一样显示在Xcode里面。



因为实际上Build target的过程就运行了SenTestngKit的脚本。

为了日常使用方便,可以在App的Target加上Unit Test的denpendency, 这样,每次Build and Go的时候Test Cases都会运行一次,如果有错,马上会停下来,显示错误。



That's all. 更多关于Test Cases写法的资料请在网上搜索OCunit

认真写好Test Cases对于项目长期的维护有难以估量的价值。

星期日, 二月 15, 2009

在Xcode3中使用SVN

不管是Web, iPhone和Mac的开发,SVN(Subversion), 已经成为我每天开发中须臾不可以离的朋友,但是这个工具对于普通的个人开发者来说有点奢侈,如果不在互联网租用一台服务器(约7000元每年)的话,是很难享用那么方便的工具的。于是我们两年前做了一个SVN的平台,svn.w18.net,把我们在广州电信的服务器的Subversion服务器共享出来,希望对大家有用,对于开源的项目是免费的,私有项目100元每年。

Xcode 3.0 以上可以完美支持SVN, 今天和大家分享一下在Xcode中使用SVN的经验。

第一步,配置 Subversion 

Leopard中自带了SVN,但Xcode的项目文件中,并不是所有文件都适于加入SVN中进行管理,比如编译后的文件和编译过程中产生的文件,这些文件不属于源代码,应该告诉svn忽略掉,方法:

编辑 ~/.subversion/config 文件 

1. 找到 global-ignores 一行,去掉注释,编辑成

global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*


Xcode项目文件中有些文件是文本文件,需要告诉SVN,因为SVN能更好地管理文本文件(谁用谁知道)

2. 找到 enable-auto-props = yes 把注释去掉,在[auto-props] Section声明以下文本文件


*.mode* = svn:mime-type=text/X-xcode
*.pbxuser = svn:mime-type=text/X-xcode
*.perspective* = svn:mime-type=text/X-xcode
*.pbxproj = svn:mime-type=text/X-xcode

第二步,配置Xcode

我们熟悉的Version Control在Xcode中叫做SCM(Software Configuration Management,学习CMMI的时候整天看到,原来就是Version Control),

1. 在Xode的菜单中选择 SCM -> Configure Repositories,填写SVN服务器的信息





2. 然后选SCM -> Repositories 你就可以Import, Check Out你想要的内容了,SVN的日常管理也可以在这里做。



3. Checkout项目以后在你的项目的属性中设置项目的SCM



4. 设置好以后,你在你的项目视图中就可以看到新的一列,M表示该文件已经修改过,然后你已经可以通过SCM菜单,或者右键菜单直接进行SVN的操作, commit,update,revert,diff and log,任何你想要的。



SCM->Get SCM Info 可以看到任何文件的版本信息



希望对大家有用。