《C#妹妹和Objective-C阿姨对话录》(03)NSString--再遇狗狗

C#妹妹:哇,冤家路窄啊,这个不是Objective-C阿姨家的狗狗么?
狗狗:日,到底谁跟谁是冤家。。
C#妹妹:不服气呀~再给你弄一陀吃吃。。
#import <Foundation/Foundation.h>
#import "Dog.h"

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    Dog *d=[Dog new];
    [d Eat:@"便便" EatQty:1];
    [d release];
    [pool drain];
    return 0;
}
狗狗:
C#妹妹:操,升级啦,看姐姐我扒你的皮,毁你的源代码。。
Objective-C阿姨:你这个小姑娘为啥总跟我狗狗过不去呀。
C#妹妹:它不吃屎也就罢了,还说什么“你留着自己吃。。。”,肯定程序出问题了,我帮他调试一下。
Objective-C阿姨:就是怕你再害它,我昨天给他升级了。。。现在代码是这个样子。。
#import "Dog.h"
@implementation Dog
-(void) Sound
{
    NSLog(@"汪汪!");
}
BOOL isTrueFood(NSString  *food)
{
    NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
    if(r.length>0)
        return(YES);
    else
        return(NO);
               
}
-(void) Eat:(NSString  *) food  EatQty:(int) count
{
    if(isTrueFood(food)==YES)
    {
        NSLog(@"吃%d斤%@",count,food);
    }
    else
    {
        NSLog(@"你留着自己吃吧。。。");
    }
}
@end//Dog
C#妹妹:哇,我们天朝特色的敏感词语过滤技术你都用上了。。。真是同一个世界,同一个噩梦啊。。。
Objective-C阿姨:,你能不能少贫点。。。。
C#妹妹:貌似其他都能看懂,除了这一句不太明白
    NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
Objective-C阿姨:这个语句里边就是用了两个NSString的方法。一个是实例方法rangeOfString,一个是类方法stringWithFormat。NSString是Cocoa中用于字符串处理的类,比C原始的字符串数组方便了很多,就像.NET的String一样,内置了很多方法。
rangeOfString功能类似与.NET中的String.IndexOf,判断一个字符串在另一个字符串中的位置,但是返回的类型是NSRange,而不是数字
NSRange的定义估计你一看就知道怎么回事了
typedef struct _NSRange {
    NSUInteger location;//起始位置
    NSUInteger length;//长度
} NSRange;
其实NSRange.location就相当于.NET中String.IndexOf的返回值。
C#妹妹:但是.NET中如果IndexOf检索不到相应的内容,返回负数,而这个location是NSUInteger类型,看起来这个类型是一种无符号整数啊,如何表示检索不到内容呢?
Objective-C阿姨:有两种方法可以解决这个问题。一种是判断length的长度,如果长度为0,表示没有找到相应的内容,另外一种判断location是否等于NSNotFound。其实NSNotFound就是NSUInteger的最大值LONG_MAX
C#妹妹:挺经典的,.NET里用负数表示检索不到内容,Objective-C里边用最大值表示。
Objective-C阿姨:是的,rangeOfString的用法类似这样
    NSString *word=@"tive";
    NSString *str=@"这是Objective-C家的狗狗!";
    NSLog(@"在字符串‘%@’中搜索‘%@’",str,word);
    NSRange r=[str rangeOfString:word];//在str中搜索word 返回NSRange 里边包含{location和length}
    if(r.location==NSNotFound)//这里判断if(r.length<=0)也是一样的
        NSLog(@"这句话里没有找到%@",word);
    else
        NSLog(@"这句话中从第%lu个字符开始后边%lu个字符是%@",r.location+1,r.length,word);
rangeOfString还可以有个参数 判断是否区分大小写什么的。比如可以这样用
    NSRange r=[str rangeOfString:word options:NSCaseInsensitiveSearch];//NSCaseInsensitiveSearch表示不区分大小写
如果看着还有点晕,再回顾一次Objective-C给对象发送消息的方式吧
另外一个用到的函数
stringWithFormat:功能类似与.NET中的string.Format,也同样都是类方法,都是用来生成字符串的。用法你看看下面的例子
    NSString *str2=[NSString stringWithFormat:@"%@爱吃%@",@"狗狗",@"包子"];
    NSLog(@"%@",str2);//这句话输出 狗狗爱吃包子

弄明白这两个方法,现在在看下面的语句应该就明白了吧。
    NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
其实是两个方法的嵌套
先向NSString类发送消息stringWithFormat生成食物名称的字符串,比如@“,包子,”
然后再向字符串@",包子,骨头,肉,冰激凌,"其实也就是NSString的实例发送消息rangeOfString检索@“,包子,”是否包含在字符串@",包子,骨头,肉,冰激凌,"中。
C#妹妹:好一段纠结的代码。。。。
Objective-C阿姨:现在就比较一下NSString与.NET中的System.String吧。
 关于字符串长度。
NSString用方法length方法。System.String有Length属性。两者都充分考虑到中文字符的问题,不论英文还是中文日本,每个字符长度加1。
关于字符串比较。
Objective-C不能用“==”号,比较字符串内容的,“==”保留了原始的引用比较功能。C#已经把“==”处理成比较直观的内容比较。
Objective-C中比较字符串是否相同正确的方法是isEqualToString。
 与.NET的System.String相同,NSString同样是不可变的
NSString所谓的改变就是生成新的字符串。与.NET的String.Text.StringBuilder一样,Objective-C提供了NSMutableString,这个类表示的字符串是可以修改的。但是与StringBuilder不同的是,他继承自NSString,意味着基类的方法,他都可以用。

各位同学,本人学习Objective-C时间很短,学习Objective-C其实不是为了Mac、iPhone开发,并没有实用,
其实是一个C#用户学习Objective-C的学习笔记,学习的确切目的是帮助我理解C#,毕竟没有比较是不可能知道所谓C#的特点的
请大家批判的眼光看这个东西,如果发现和其他文章、书籍、评论、资料有冲突,请尽量以其他文章为准。并给我留言
也邀请所有高手积极拍砖,我正好用来盖房子~~~
《C#妹妹和Objective-C阿姨对话录》

(01)认识Objective-C--初次见面的问候 
(02)这就是类--阿姨的狗狗 
(03)NSString--再遇狗狗
(04)垃圾回收基础--拆迁队那点事

        待续⋯⋯

posted @ 2011-04-16 02:49  小墨的童鞋  阅读(4530)  评论(13编辑  收藏  举报