Archive for 2009 十二月
NSRange 和 NSString
by Elton on 2009年12月25日, under Mac
NSRange的定义
-
typedef struct _NSRange
-
{
-
NSUInteger location;
-
NSUInteger length;
-
} NSRange;
-
NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。 而NSUInteger类型的定义如下:
-
#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
-
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]);
-
搜索字符串:
-
-
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
下面这个例子将从后向前反向搜索字符串:
-
-
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 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连接选项是告诉编译器将所连接的库全部包含,而不是用到才引入。
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函数
如何正确释放Properties变量
by Elton on 2009年12月14日, under Mac
今天在看iPhone Development Cookbook 2nd Edition的时候,学习到如何正确释放Properties变量。
例如你有一个Properties变量:
如何正确释放呢? 正确的方式是
-
-
self.colors = nil;
-
这样Objective-c先release原先的colors变量,然后再将nil赋值给colors。
可能你觉得这样也可以
-
-
[self.colors release];
-
但是这样可能会导致一个错误出现,因为你现在release了这个变量,减少了它的retain计数,比如从1减为0,当下次再为这个变量进行复制的时候,因为objective-c会先release这个变量,所以就导致两次release,会导致系统崩溃。
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,代理请求
下面来两个小例子:
-
-
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
-
[request start];
-
if (!error) {
-
}
-
当你需要添加更多的请求信息时,如,添加个请求Header:
-
-
[request addRequestHeader:@"name" value:@"Jory lee"];
-
添加Post请求时的健值:
-
-
[request setPostValue:@"Ben" forKey:@"first_name"];
-
[request setPostValue:@"Copsey" forKey:@"last_name"];
-
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
-
设置HTTP的授权帐号:
-
-
[request setUsername:@"username"];
-
[request setPassword:@"password"];
-
一个异步请求:
-
-
- (IBAction)grabURLInBackground:(id)sender
-
{
-
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
-
[request setDelegate:self];
-
[request startAsynchronous];
-
}
-
-
- (void)requestFinished:(ASIHTTPRequest *)request
-
{
-
// Use when fetching text data
-
-
// Use when fetching binary data
-
}
-
-
- (void)requestFailed:(ASIHTTPRequest *)request
-
{
-
}
-
在我们数据获取的过程中,如果数据源复杂,一个请求队列是必不可少的:
-
-
- (IBAction)grabURLInTheBackground:(id)sender
-
{
-
if (![self queue]) {
-
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
-
}
-
-
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
-
{
-
}
-
-
- (void)requestWentWrong:(ASIHTTPRequest *)request
-
{
-
}
-
第一个iPhone App成功顺利发布!送促销码!!
by Elton on 2009年12月10日, under iPhone
利用工作之余的时间,自己慢慢摸索试着做了一个小的iPhone小程序,开发中也学习了很多前人的经验,收获不少。整个上线发布工作也很顺利,没有遇到任何问题,看来运气还不错:)
这个程序是我第一个程序,是一个恶搞朋友的娱乐程序。
让您的iPhone成为类似放屁垫之类的恶搞工具。它会播放20多种不同的放屁音效!并具有倒计时自动播放功能。
把它放到您的口袋里,您会看到所有人都远离您(特别是在拥挤的地方,比如公车地铁之类的地方)。您也可以设置倒计时功能,然后把您的iPhone放到您朋友的座位边上。 当他开始放屁的时候,看看周围的朋友笑到流出眼泪,想象一下您这位被恶搞朋友的表情吧。
应用介绍网站:http://apps.prosight.me/crazy-fart/
iTunes下载链接:点击这里下载
如果大家喜欢,可以去这里领取Promotion code后免费下载
使用AVAudioPlayer播放音乐文件
by Elton on 2009年12月7日, under iPhone
AVAudioPlayer 提供了大量的特性,包括暂停播放,调整音量,监控音频的峰值和均值等等。 我们看下面的例子:
-
-
AVAudioPlayer *player;
-
NSString *path;
-
-
// 设置音乐文件路径
-
-
// 判断是否可以访问这个文件
-
{
-
// 设置 player
-
player = [[AVAudioPlayer alloc] initWithContentsOfURL:
-
-
// 调节音量 (范围从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 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
-
-
$ sudo gem install -r passenger
-
$ sudo passenger-install-apache2-module
-
-
-
$ cd /etc/apache2
-
编辑httpd.conf加入一下代码:
-
-
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位的版本。
-
-
$ 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 2009年12月3日, under Linux
Unix like的开发如果用stat()函数访问文件的话,会用到struct stat结构体。 其定义如下:
-
-
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 2009年12月1日, under Mac
如果你经常使用终端程序,这个小程序一定可以帮到你。他能将终端窗口变成类似雷神或CS那样的下拉窗口,非常酷。
可以从这里下载 http://visor.binaryage.com/
这个软件需要SIMBL ,如果你没有安装,要先安装这个。
之后将下载下来的文件解压,将解压后的文件拷贝至/Library/Application Support/SIMBL/Plugins,之后再重新启动你的终端你就可以看到效果了。 默认的快捷启动键是Ctrl+`



