Elton's Blog

Archive for 2009 十二月

NSRange 和 NSString

by Elton on 2009年12月25日, under Mac

NSRange的定义

  1. typedef struct _NSRange
  2. {
  3.   NSUInteger location;
  4.   NSUInteger length;
  5. } NSRange;
  6.  

NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。 而NSUInteger类型的定义如下:

  1. #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
  2. typedef unsigned long NSUInteger;
  3. #else
  4. typedef unsigned int NSUInteger;
  5. #endif
  6.  

例子:
下面这个例子,将输出IPA

  1. NSString *homebrew = @"Imperial India Pale Ale (IPA)";
  2.  
  3. // Starting at position 25, get 3 characters
  4. NSRange range = NSMakeRange (25, 3);
  5.  
  6. // This would also work:
  7. // NSRange range = {25, 3};
  8.  
  9. NSLog (@"Beer shortname: %@", [homebrew substringWithRange:range]);
  10.  

搜索字符串:

  1.  
  2. NSString *homebrew = @"Imperial India Pale Ale (IPA)";
  3. NSRange range = [homebrew rangeOfString:@"IPA"];
  4.  
  5. // Did we find the string "IPA" ?
  6. if (range.length > 0)
  7.   NSLog(@"Range is: %@", NSStringFromRange(range));
  8.  

上面的程序将输出Range is: {25, 3}。NSStringFromRange()方法,将一个NSRange返回一个NSString。而另外一个函数NSRangeFromString()则是将NSString转换为NSRange

下面这个例子将从后向前反向搜索字符串:

  1.  
  2. NSString *homebrew = @"Imperial India Pale Ale (IPA)";
  3.  
  4. // Search for the "ia" starting at the end of string
  5. NSRange range = [homebrew rangeOfString:@"ia" options:NSBackwardsSearch];
  6.  
  7. // What did we find
  8. if (range.length > 0)
  9.   NSLog(@"Range is: %@", NSStringFromRange(range));
  10.  

上面的程序将输出:Range is: {12, 2}

Objective-C中没有正则表达式,如果你想使用更复杂的字符串匹配,可以使用这个类库RegexKitLite。它提供了完整的正则表达式实现。

1 Comment :, , more...

iPhone开发库引用的问题

by Elton on 2009年12月23日, 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连接选项是告诉编译器将所连接的库全部包含,而不是用到才引入。

引自:http://www.flyblog.info/tag/three20

1 Comment :, more...

Apple开始允许开发者使用私有API

by Elton on 2009年12月16日, 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函数

Leave a Comment :, , more...

如何正确释放Properties变量

by Elton on 2009年12月14日, under Mac

今天在看iPhone Development Cookbook 2nd Edition的时候,学习到如何正确释放Properties变量。
例如你有一个Properties变量:

  1.  
  2. @property (retain) NSArray *colors;
  3. self.colors = [NSArray arrayWithObjects:@"Gray", @"Silver", @"Black"];
  4.  

如何正确释放呢? 正确的方式是

  1.  
  2. self.colors = nil;
  3.  

这样Objective-c先release原先的colors变量,然后再将nil赋值给colors。

可能你觉得这样也可以

  1.  
  2. [self.colors release];
  3.  

但是这样可能会导致一个错误出现,因为你现在release了这个变量,减少了它的retain计数,比如从1减为0,当下次再为这个变量进行复制的时候,因为objective-c会先release这个变量,所以就导致两次release,会导致系统崩溃。

4 Comments :, , more...

ASIHTTPRequest 一款强大的HTTP包装开源项目

by Elton on 2009年12月11日, under Mac

ASIHTTPRequest,是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装。
特色功能如下:
1,下载的数据直接保存到内存或文件系统里
2,提供直接提交(HTTP POST)文件的API
3,可以直接访问与修改HTTP请求与响应HEADER
4,轻松获取上传与下载的进度信息
5,异步请求与队列,自动管理上传与下载队列管理机
6,认证与授权的支持
7,Cookie
8,请求与响应的GZIP
9,代理请求

下面来两个小例子:

  1.  
  2. NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
  3. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  4. [request start];
  5. NSError *error = [request error];
  6. if (!error) {
  7.     NSString *response = [request responseString];
  8. }
  9.  

当你需要添加更多的请求信息时,如,添加个请求Header:

  1.  
  2. [request addRequestHeader:@"name" value:@"Jory lee"];
  3.  

添加Post请求时的健值:

  1.  
  2. [request setPostValue:@"Ben" forKey:@"first_name"];
  3. [request setPostValue:@"Copsey" forKey:@"last_name"];
  4. [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
  5.  

设置HTTP的授权帐号:

  1.  
  2. [request setUsername:@"username"];
  3. [request setPassword:@"password"];
  4.  

一个异步请求:

  1.  
  2. - (IBAction)grabURLInBackground:(id)sender
  3. {
  4. NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
  5. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  6. [request setDelegate:self];
  7. [request startAsynchronous];
  8. }
  9.  
  10. - (void)requestFinished:(ASIHTTPRequest *)request
  11. {
  12. // Use when fetching text data
  13. NSString *responseString = [request responseString];
  14.  
  15. // Use when fetching binary data
  16. NSData *responseData = [request responseData];
  17. }
  18.  
  19. - (void)requestFailed:(ASIHTTPRequest *)request
  20. {
  21. NSError *error = [request error];
  22. }  
  23.  

在我们数据获取的过程中,如果数据源复杂,一个请求队列是必不可少的:

  1.  
  2. - (IBAction)grabURLInTheBackground:(id)sender
  3. {
  4. if (![self queue]) {
  5. [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
  6. }
  7.  
  8. NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
  9. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  10. [request setDelegate:self];
  11. [request setDidFinishSelector:@selector(requestDone:)];
  12. [request setDidFailSelector:@selector(requestWentWrong:)];
  13. [[self queue] addOperation:request]; //queue is an NSOperationQueue
  14. }
  15.  
  16. - (void)requestDone:(ASIHTTPRequest *)request
  17. {
  18. NSString *response = [request responseString];
  19. }
  20.  
  21. - (void)requestWentWrong:(ASIHTTPRequest *)request
  22. {
  23. NSError *error = [request error];
  24. }  
  25.  

援引自:http://www.cocoachina.com/bbs/read.php?tid-9455.html

5 Comments :, more...

第一个iPhone App成功顺利发布!送促销码!!

by Elton on 2009年12月10日, under iPhone

利用工作之余的时间,自己慢慢摸索试着做了一个小的iPhone小程序,开发中也学习了很多前人的经验,收获不少。整个上线发布工作也很顺利,没有遇到任何问题,看来运气还不错:)

这个程序是我第一个程序,是一个恶搞朋友的娱乐程序。


Crazy Fart 整人放屁精

让您的iPhone成为类似放屁垫之类的恶搞工具。它会播放20多种不同的放屁音效!并具有倒计时自动播放功能。

把它放到您的口袋里,您会看到所有人都远离您(特别是在拥挤的地方,比如公车地铁之类的地方)。您也可以设置倒计时功能,然后把您的iPhone放到您朋友的座位边上。 当他开始放屁的时候,看看周围的朋友笑到流出眼泪,想象一下您这位被恶搞朋友的表情吧。

应用介绍网站:http://apps.prosight.me/crazy-fart/
iTunes下载链接:点击这里下载

如果大家喜欢,可以去这里领取Promotion code后免费下载

7 Comments :, more...

使用AVAudioPlayer播放音乐文件

by Elton on 2009年12月7日, under iPhone

AVAudioPlayer 提供了大量的特性,包括暂停播放,调整音量,监控音频的峰值和均值等等。 我们看下面的例子:

  1.  
  2. AVAudioPlayer  *player;
  3. NSString       *path;
  4.  
  5. // 设置音乐文件路径
  6. path = [[NSBundle mainBundle] pathForResource:@"sound-file" ofType:@"mp3"];
  7.  
  8. // 判断是否可以访问这个文件
  9. if ([[NSFileManager defaultManager] fileExistsAtPath:path])
  10. {    
  11.   // 设置 player
  12.   player = [[AVAudioPlayer alloc] initWithContentsOfURL:
  13.      [NSURL fileURLWithPath:path] error:&error];
  14.  
  15.   // 调节音量 (范围从0到1)
  16.   player.volume = 0.4f;
  17.  
  18.   // 准备buffer,减少播放延时的时间      
  19.   [player prepareToPlay];
  20.  
  21.   // 设置播放次数,0为播放一次,负数为循环播放
  22.   [player setNumberOfLoops:0];
  23.  
  24.   [player play];    
  25.  
  26. }    
  27.  
  28.  
  29. // 清理工作
  30. if (player != nil)
  31. {
  32.   if (player.isPlaying == YES)
  33.     [player stop];
  34.   [player release];
  35. }
  36.  
21 Comments :, more...

Snow Leopard下,为Rails升级

by Elton on 2009年12月6日, 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
  3. $ sudo passenger-install-apache2-module
  4.  
  1.  
  2. $ cd /etc/apache2
  3.  

编辑httpd.conf加入一下代码:

  1.  
  2. LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-2.2.4/ext/apache2/mod_passenger.so
  3. PassengerRoot /Library/Ruby/Gems/1.8/gems/passenger-2.2.4
  4. PassengerRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
  5.  

安装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.  
  2. $ sudo env ARCHFLAGS="-arch x86_64" gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config
  3.  

注意,你不需要使用ARCHFLAGS来重新编译其他gem

原文地址:http://weblog.rubyonrails.org/2009/8/30/upgrading-to-snow-leopard

3 Comments :, , , , , more...

struct stat

by Elton on 2009年12月3日, under Linux

Unix like的开发如果用stat()函数访问文件的话,会用到struct stat结构体。 其定义如下:

  1.  
  2. struct stat {
  3.         mode_t     st_mode;       //文件对应的模式,文件,目录等
  4.         ino_t      st_ino;       //inode节点号
  5.         dev_t      st_dev;        //设备号码
  6.         dev_t      st_rdev;       //特殊设备号码
  7.         nlink_t    st_nlink;      //文件的连接数
  8.         uid_t      st_uid;        //文件所有者
  9.         gid_t      st_gid;        //文件所有者对应的组
  10.         off_t      st_size;       //普通文件,对应的文件字节数
  11.         time_t     st_atime;      //文件最后被访问的时间
  12.         time_t     st_mtime;      //文件内容最后被修改的时间
  13.         time_t     st_ctime;      //文件状态改变时间
  14.         blksize_t st_blksize;    //文件内容对应的块大小
  15.         blkcnt_t   st_blocks;     //伟建内容对应的块数量
  16.       };
  17.  
Leave a Comment :, , more...

Visor – 把你的终端变成Quake式的下拉形式

by Elton on 2009年12月1日, under Mac

如果你经常使用终端程序,这个小程序一定可以帮到你。他能将终端窗口变成类似雷神或CS那样的下拉窗口,非常酷。

可以从这里下载 http://visor.binaryage.com/

这个软件需要SIMBL ,如果你没有安装,要先安装这个。

之后将下载下来的文件解压,将解压后的文件拷贝至/Library/Application Support/SIMBL/Plugins,之后再重新启动你的终端你就可以看到效果了。 默认的快捷启动键是Ctrl+`

Visor

Leave a Comment :, , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit my friends!

A few highly recommended friends...