Objective-C常用类 - NSString,NSMutableString

NSString

字符串,也可以说是最常用到的,程序中无处不在啊,字符串具体是什么一个东西,这里就不多做介绍了,主要看一下他的一些常用方法。

在《Objective-C入门》中已经提到跟用过了,就是@"Hello World!",这其实就已经是一个NSString对象了

首先提到的一个方法,初始化NSString

// 直接赋值,类似与JAVA/C#中的String str = "Hello World";
NSString *str = @"Hello World";
// 采用NSString提供的一个类方法
+ (id) stringWithFormat:(NSString *)format, ...;
NSString *str1 = [NSString stringWithFormat: @"Hello World"];
NSString *str2 = [NSString stringWithFormat: @"the number is %d", 9];

类方法,前面带"+"符号的,所以是直接用NSString调用,这个方法声明后面的"...",这个在NSLog(format, ...);中有见到过,这个在JAVA/C#中也经常可以见到,代表的是这个方法后面可以接收多个以","分割的其他参数(这一个在xcode中,编译器会对第一个参数format中的占位符[%@,%d,%i,%f等]跟后面的多个参数进行检查,如果对不上编译器会有警告);在Objective-C中其实有不少这样的方法,让我感到挺困惑的,在Objective-C里面,方法的调用都是采用的[obj method:v1 p2:v2]的形式,但是这些却是采用了","

当然,NSString初始化的方法肯定不止以上两种,比如下面这两种,至于其更多的用法以及说明,请自行查阅API

// 具体更多的,可自行查API。
+ (id)stringWithCharacters:(const unichar *)chars length:(NSUInteger)length;
+ (id)stringWithString:(NSString *)val

 长度、比较等

// 获取字符串长度
- (NSUInteger)length;
if ([str length] == 0) {
    NSLog(@"empty!");
}
// 比较字符串值,相当于JAVA中的str.equals(s);
- (BOOL) isEqualToString:(NSString *)str;
if ([str isEqualToString:@"hello"]) {
    NSLog(@"same!");
}
// 是否以指定的str开头
- (BOOL) hasPrefix:(NSString *)str;
NSString *str = @"ios_6.0";
if ([str hasPrefix:@"ios_"]) {
    NSLog(@"Contain the prefix 'ios_'");
}
// 是否以指定的str结尾
NSString *str = @"ios.jpg";
- (BOOL) hasSuffix:(NSString *)str;
if ([str hasSuffix:@".jpg"]) {
    NSLog(@"Contain the suffix '.jpg'");
}

length跟isEqualToString就不说了,要注意的就是比较两个字符串可不要用"==",因为那仅仅是比较的是指针。

hasPrefix, hasSuffix按照上面的例子,也容易理解,用这两个方法,上传文件的时候,要判断啥后缀名的,方便多了。获取扩展名还有一个更方便的方法,如下

// 获取一个路径中的扩展名
- (NSString *)pathExtension;
// 这个方法在API中有很详细的解释
[@"/tmp/scratch.tiff" pathExtension];  // 返回tiff
[@".scratch.tiff" pathExtension];    // 返回tiff
[@"/tmp/scratch" pathExtension];     // 返回"",返回一个空字符串
[@"/tmp/scratch..tiff" pathExtension]; // 返回tiff

在Objective-C中,NSString初始化赋值过后,其值是不可再被改变的,类似于JAVA/C#中的str += "append content";是不被允许的,所以需要声明一个可变的字符串这里用到了NSString的一个子类NSMutableString(这点与JAVA/C#不同,NSString并不是final/sealed的,允许被继承)

这个不可改变感觉有点说不通,其实就像JAVA中的String一样的意思,JAVA中String变量声明赋值后,值也是不可以改变的,对于采用"+="的操作改变的值,其实底层的实现是重新实例化了String,完全是一个新的对象了,并不是之前声明的变量,所以在JAVA中是很不推荐采用str = str1 + str2; str += "";方式拼接字符串的

所以在Objective-C中,也是一样的道理,当然,你可以使用类似以下做法(不推荐实际应用中使用)

NSString *hw = @"hello";
hw = [NSString stringWithFormat:@"%@ world", hw];
NSLog(@"new content: %@", hw);

NSMutableString

顾名思义,可变的字符串,类似于JAVA/C#中的StringBuilder, StringBuffer

NSMutableString是NSString的子类,所以上面所介绍到的方法在NSMutableString中都是可以使用的,所以要了解的是NSMutableString自身提供的一些常用方法

// 指定容量初始化NSMutableString
+ (id)stringWithCapacity:(NSUInteger)capacity;
// 追加内容
- (void)appendFormat:(NSString *)format, ...;
- (void)appendString:(NSString *)str;
// 在指定索引位置插入内容
- (void)insertString:(NSString *)str atIndex:(NSUInteger)idx;
// 相当于重置内容
- (void)setString:(NSString *)str;
// examples
NSMutableString tmp = [NSMutableString stringWithCapacity:8];
[tmp appendFormat:@"Hello %@", @"World"]; // tmp: "Hello World"
[tmp appendFormat:@" ! abc"];           // tmp: "Hello World ! abc"
[tmp insertString:@"-h" atIndex: 1];    // tmp: "H-hello World ! abc"
[tmp setString:@"Hello Objective-C"];   // tmp: "Hello Objective-C"

stringWithCapacity:方法,为指定容量实例化NSMutableString,该容量的作用只是一个建议分配的容量,用来提高存储效率的,并非实例化后的容量是固定的,这个相当于JAVA/C#中的StringBuilder等一样,他们均提供了带有容量参数的构造函数,这个值并没有限制字符串的长度。也就是说在到达容量的字符数时,继续追加内容其容量会自动扩展

appendFormat:,appendString:方法,都是将字符串追加到末尾,appendFormat:跟前面提到的stringWithFormat:差不多的意思,只是先格式化字符串后再进行了追加,appendString:则是直接将提供的参数追加到末尾

insertString:atIndex:方法,这个方法在JAVA/C#中的StringBuilder也有,在指定索引位置插入内容

setString:这个方法在StringBuilder好像就没有了,直接将参数的字符串替换原内容

附:

前面提到是不少方法的返回值都是(id),现在不深入研究的情况下可以暂时帮他当作是JAVA中的Object的意思,在C#中就好理解了,因为C#中有个var

在Objective-C中,你这样写都是被允许的

// id本身的定义就是指针类型的,所以这里不用加"*"
// Car与Person无任何继承等关系的两个自定义class
id c = [Car new];
[c run];    // 调用Car的run方法
c = [Person new];
[c say];    // 调用Person的say方法
// 以上的前提是,Car的run方法、Person的say方法是存在的

 

posted @ 2013-03-13 11:19  ice_liu  阅读(2064)  评论(0)    收藏  举报