Archive for 十二月, 2009
NSRange 和 NSString
by Elton on 十二.25, 2009, under Mac
NSRange的定义
1 2 3 4 5 | typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; |
NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。 而NSUInteger类型的定义如下:
1 2 3 4 5 | #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typedef unsigned long NSUInteger; #else typedef unsigned int NSUInteger; #endif |
例子:
下面这个例子,将输出IPA
1 2 3 4 5 6 7 8 9 | NSString *homebrew = @"Imperial India Pale Ale (IPA)"; // Starting at position 25, get 3 characters NSRange range = NSMakeRange (25, 3); // This would also work: // NSRange range = {25, 3}; NSLog (@"Beer shortname: %@", [homebrew substringWithRange:range]); |
搜索字符串:
1 2 3 4 5 6 | NSString *homebrew = @"Imperial India Pale Ale (IPA)"; NSRange range = [homebrew rangeOfString:@"IPA"]; // Did we find the string "IPA" ? if (range.length > 0) NSLog(@"Range is: %@", NSStringFromRange(range)); |
上面的程序将输出Range is: {25, 3}。NSStringFromRange()方法,将一个NSRange返回一个NSString。而另外一个函数NSRangeFromString()则是将NSString转换为NSRange
下面这个例子将从后向前反向搜索字符串:
1 2 3 4 5 6 7 8 | NSString *homebrew = @"Imperial India Pale Ale (IPA)"; // Search for the "ia" starting at the end of string NSRange range = [homebrew rangeOfString:@"ia" options:NSBackwardsSearch]; // What did we find if (range.length > 0) NSLog(@"Range is: %@", NSStringFromRange(range)); |
上面的程序将输出:Range is: {12, 2}
Objective-C中没有正则表达式,如果你想使用更复杂的字符串匹配,可以使用这个类库RegexKitLite。它提供了完整的正则表达式实现。
iPhone开发库引用的问题
by Elton on 十二.23, 2009, under iPhone
最近的项目用到了著名的Three20界面库, 程序发布完成结果背Apple拒绝,理由是使用了Private APIs, 没话说,肯定是Three20的问题。
于是获取最新代码,编译之后对可执行文件进行扫描确认没有Private APIs被调用了之后再build最终版本以提交App Store, 不知道是哪根筋不对突然觉得是否应该在真机上编译个release版本再提交,不然又要等若干天,万一被打回又得耽误功夫。
果然,一试吓一跳, 无法运行,原因是Three20中的所有对SDK种类的扩展都没被打包编译进来,运行时无法找到相应的selector,当然就crash了
开始是google搜寻答案,屡试之后,静下心来看看Three20的文档, 看到最后才恍然大悟,原来还需要一个 -all_load 连接选项。添加后编译运行,一切顺利, god。
然后翻阅水果文档,才知道 -all_load link option连接选项是告诉编译器将所连接的库全部包含,而不是用到才引入。
Apple开始允许开发者使用私有API
by Elton on 十二.16, 2009, under iPhone
在iPhone的程序使用私有API的态度上,Apple的态度似乎有些松动,在Apple官方的开发者论坛中公布了允许开发者使用UIGetScreenImage() 这个私有API函数。
这个函数可以让开发者截取用户当前的屏幕。
After carefully considering the issue, Apple is now allowing applications to use the function UIGetScreenImage() to programmatically capture the current screen contents.” The function prototype is as follows:
CGImageRef UIGetScreenImage();
并且Apple表态说在今后公布的SDK中,可能会公布跟这个函数等效的公开API函数
如何正确释放Properties变量
by Elton on 十二.14, 2009, under Mac
今天在看iPhone Development Cookbook 2nd Edition的时候,学习到如何正确释放Properties变量。
例如你有一个Properties变量:
1 2 | @property (retain) NSArray *colors; self.colors = [NSArray arrayWithObjects:@"Gray", @"Silver", @"Black"]; |
如何正确释放呢? 正确的方式是
1 | self.colors = nil; |
这样Objective-c先release原先的colors变量,然后再将nil赋值给colors。
可能你觉得这样也可以
1 | [self.colors release]; |
但是这样可能会导致一个错误出现,因为你现在release了这个变量,减少了它的retain计数,比如从1减为0,当下次再为这个变量进行复制的时候,因为objective-c会先release这个变量,所以就导致两次release,会导致系统崩溃。
ASIHTTPRequest 一款强大的HTTP包装开源项目
by Elton on 十二.11, 2009, under Mac
ASIHTTPRequest,是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装。
特色功能如下:
1,下载的数据直接保存到内存或文件系统里
2,提供直接提交(HTTP POST)文件的API
3,可以直接访问与修改HTTP请求与响应HEADER
4,轻松获取上传与下载的进度信息
5,异步请求与队列,自动管理上传与下载队列管理机
6,认证与授权的支持
7,Cookie
8,请求与响应的GZIP
9,代理请求
下面来两个小例子:
1 2 3 4 5 6 7 | NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request start]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; } |
当你需要添加更多的请求信息时,如,添加个请求Header:
1 | [request addRequestHeader:@"name" value:@"Jory lee"]; |
添加Post请求时的健值:
1 2 3 | [request setPostValue:@"Ben" forKey:@"first_name"]; [request setPostValue:@"Copsey" forKey:@"last_name"]; [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; |
设置HTTP的授权帐号:
1 2 | [request setUsername:@"username"]; [request setPassword:@"password"]; |
一个异步请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | - (IBAction)grabURLInBackground:(id)sender { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; [request startAsynchronous]; } - (void)requestFinished:(ASIHTTPRequest *)request { // Use when fetching text data NSString *responseString = [request responseString]; // Use when fetching binary data NSData *responseData = [request responseData]; } - (void)requestFailed:(ASIHTTPRequest *)request { NSError *error = [request error]; } |
在我们数据获取的过程中,如果数据源复杂,一个请求队列是必不可少的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | - (IBAction)grabURLInTheBackground:(id)sender { if (![self queue]) { [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; } NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; [request setDidFinishSelector:@selector(requestDone:)]; [request setDidFailSelector:@selector(requestWentWrong:)]; [[self queue] addOperation:request]; //queue is an NSOperationQueue } - (void)requestDone:(ASIHTTPRequest *)request { NSString *response = [request responseString]; } - (void)requestWentWrong:(ASIHTTPRequest *)request { NSError *error = [request error]; } |
第一个iPhone App成功顺利发布!送促销码!!
by Elton on 十二.10, 2009, under iPhone
利用工作之余的时间,自己慢慢摸索试着做了一个小的iPhone小程序,开发中也学习了很多前人的经验,收获不少。整个上线发布工作也很顺利,没有遇到任何问题,看来运气还不错:)
这个程序是我第一个程序,是一个恶搞朋友的娱乐程序。
让您的iPhone成为类似放屁垫之类的恶搞工具。它会播放20多种不同的放屁音效!并具有倒计时自动播放功能。
把它放到您的口袋里,您会看到所有人都远离您(特别是在拥挤的地方,比如公车地铁之类的地方)。您也可以设置倒计时功能,然后把您的iPhone放到您朋友的座位边上。 当他开始放屁的时候,看看周围的朋友笑到流出眼泪,想象一下您这位被恶搞朋友的表情吧。
应用介绍网站:http://apps.prosight.me/crazy-fart/
iTunes下载链接:点击这里下载
如果大家喜欢,可以去这里领取Promotion code后免费下载
使用AVAudioPlayer播放音乐文件
by Elton on 十二.07, 2009, under iPhone
AVAudioPlayer 提供了大量的特性,包括暂停播放,调整音量,监控音频的峰值和均值等等。 我们看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | AVAudioPlayer *player; NSString *path; // 设置音乐文件路径 path = [[NSBundle mainBundle] pathForResource:@"sound-file" ofType:@"mp3"]; // 判断是否可以访问这个文件 if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { // 设置 player player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:&error]; // 调节音量 (范围从0到1) player.volume = 0.4f; // 准备buffer,减少播放延时的时间 [player prepareToPlay]; // 设置播放次数,0为播放一次,负数为循环播放 [player setNumberOfLoops:0]; [player play]; } ... // 清理工作 if (player != nil) { if (player.isPlaying == YES) [player stop]; [player release]; } |
Snow Leopard下,为Rails升级
by Elton on 十二.06, 2009, under Rails
Snow Leopard是Apple最新的操作系统,拥有更快的速度并减少了对磁盘的占用。 Snow Leopard自带了ruby 1.8.7,已经可以很好的兼容Rails2.*。 对于Rails的开发者应该注意,如果你是从Leopard升级而来,Snow Leopard默认所有的解释型语言都是64位的(包括Ruby)。所以,如果之前你用的是32位的组建,需要做一些更新。
安装Snow Leopard 开发工具
在安装光盘上选择 “Optional Installs”, 安装 “Xcode.mpkg”. 使用默认的设置
安装Passenger
1 2 | $ sudo gem install -r passenger $ sudo passenger-install-apache2-module |
1 | $ cd /etc/apache2 |
编辑httpd.conf加入一下代码:
1 2 3 | LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-2.2.4/ext/apache2/mod_passenger.so PassengerRoot /Library/Ruby/Gems/1.8/gems/passenger-2.2.4 PassengerRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby |
安装MySQL
为了避免不必要的麻烦,强烈推荐你安装64位版本的MySQL。停止之前版本的MySQL。
从这里安装适合Mac OS X 10.5 (x86_64)的MySQL
下载完成后,打开磁盘镜像,首先安装 “mysql-5.1.37-osx10.5-x86_64.pkg”. 使用默认项即可。
然后安装 “MySQLStartupItem.pkg”. 作为Mac的启动项.
最后安装 “MySQL.prefPane”.
如果之前你安装过32位的MySQL gem,那么你需要重新安装一份适合64位的版本。
1 | $ sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config |
注意,你不需要使用ARCHFLAGS来重新编译其他gem
原文地址:http://weblog.rubyonrails.org/2009/8/30/upgrading-to-snow-leopard
struct stat
by Elton on 十二.03, 2009, under Linux
Unix like的开发如果用stat()函数访问文件的话,会用到struct stat结构体。 其定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | struct stat { mode_t st_mode; //文件对应的模式,文件,目录等 ino_t st_ino; //inode节点号 dev_t st_dev; //设备号码 dev_t st_rdev; //特殊设备号码 nlink_t st_nlink; //文件的连接数 uid_t st_uid; //文件所有者 gid_t st_gid; //文件所有者对应的组 off_t st_size; //普通文件,对应的文件字节数 time_t st_atime; //文件最后被访问的时间 time_t st_mtime; //文件内容最后被修改的时间 time_t st_ctime; //文件状态改变时间 blksize_t st_blksize; //文件内容对应的块大小 blkcnt_t st_blocks; //伟建内容对应的块数量 }; |
Visor – 把你的终端变成Quake式的下拉形式
by Elton on 十二.01, 2009, under Mac
如果你经常使用终端程序,这个小程序一定可以帮到你。他能将终端窗口变成类似雷神或CS那样的下拉窗口,非常酷。
可以从这里下载 http://visor.binaryage.com/
这个软件需要SIMBL ,如果你没有安装,要先安装这个。
之后将下载下来的文件解压,将解压后的文件拷贝至/Library/Application Support/SIMBL/Plugins,之后再重新启动你的终端你就可以看到效果了。 默认的快捷启动键是Ctrl+`



