字符串處理
Objective-C(以下簡(jiǎn)稱OC)中進(jìn)行字符串操作的類是NSString
瞳浦。下面介紹一下NSString
的用法担映。
初始化
NSString* str1 = @"HelloWorld"; //直接以字符串對(duì)象賦值
NSString* str2 = [[NSString alloc] initWithCString:"HelloWorld" encoding: NSUTF8StringEncoding]; //調(diào)用init方法,當(dāng)然還有其他的init方法
NSString* str3 = [NSString stringWithString: str1]; //使用工廠方法生成
基本的形式就是這三種叫潦,更多的init和工廠方法可查閱NSString的文檔蝇完。
不可變性
NSString對(duì)象一旦初始化完成便不可更改,這是為了滿足NSObject對(duì)象的共享機(jī)制矗蕊。比如上面的代碼中四敞,雖然str3是根據(jù)str1以工廠方法產(chǎn)生的,但其實(shí)由于共享機(jī)制拔妥,str3和str1指向同一位置忿危。
打印str1和str3的地址,如下
因此修改一個(gè)NSString對(duì)象其實(shí)都是以產(chǎn)生一個(gè)新的NSString對(duì)象來進(jìn)行的没龙。
str3 = [str3 stringByAppendingString:@"你好铺厨,世界!"];
NSLog(@"str3 = %p, str3cont = %@", str3, str3);
結(jié)果如下:
字符串比較
NSString的比較有兩種方式缎玫。
//比較內(nèi)容
if ([str2 isEqualToString:str1]) {
NSLog(@"str2 is equal to str1");
}
//比較地址
if (str2 == str1) {
NSLog(@"str2 == str2");
}
第一種方式是比較NSString對(duì)象的內(nèi)容是否一致,第二種方式是比較兩者的地址是否相同解滓≡吣ィ考慮到共享機(jī)制,一般地址相同也就意味著內(nèi)容相同洼裤,但地址不相同不意味內(nèi)容不相同邻辉。上面的str1和str2內(nèi)容是相同的,但地址不同腮鞍。
NSMutableString
NSMutableString是NSString的子類值骇,它具有可變性,也就意味著不具有共享性移国。因?yàn)樗荖SString的子類吱瘩,而NSString其實(shí)是不可變得,所以NSMutableString內(nèi)部的修改方式還是生成一個(gè)新的字符對(duì)象迹缀。
數(shù)組NSArray
初始化
數(shù)組的初始化方法和NSString類似使碾。也是直接賦值數(shù)組對(duì)象,使用init方法和工廠方法祝懂。
NSArray* array1 = @[@"Beijing", @"shanghai", @"guangzhou"];
NSArray* array2 = [NSArray arrayWithObjects:@"Beijing", @"Shanghai", @"guangzhou", nil];
NSArray* array3 = [[NSArray alloc] initWithObjects:@"Beijing", @"Shanghai", @"guangzhou", nil];
在OC中NSArray被定義為class票摇,因此上面第一種方式,要在c語(yǔ)言形式的數(shù)組前面加上@
以包裝成對(duì)象類型砚蓬,這和NSString中的@"HelloWorld"
是一樣的情況矢门。
NSArray中的元素也必須是對(duì)象,也就是NSObject的子類怜械。這就是說值類型(如int, float, struct)是不能作為NSArray的元素的。這就需要將值類型的元素封裝成對(duì)象類型才能存在NSArray中傅事。
int, double等數(shù)值類型用 NSNumber對(duì)象封裝
struct用NSValue封裝
不可變性
同NSString一樣缕允,NSArray類型也具有恒定性,一旦生成就不能修改長(zhǎng)度和元素指針蹭越。但可以改變?cè)刂羔樦赶虻膬?nèi)容障本。
遍歷
NSArray最常用的一個(gè)操作就是遍歷。
//Fast Enumeration
for (NSString* str in array1) {
NSLog(@"%@", str);
}
//使用NSEnumerator
NSEnumerator* enumerator = [array1 objectEnumerator];
NSString* str;
while (str = [enumerator nextObject]) {
NSLog(@"%@", str);
}
//c語(yǔ)言for循環(huán)
for (int index = 0; index < array1.count; index++) {
NSLog(@"%@", array1[index]);
}
這三種方式响鹃,推薦使用第一種方式驾霜,因?yàn)樗亲羁斓摹:髢煞N方式的訪問都是需要進(jìn)行索引檢查和動(dòng)態(tài)消息买置,而第一種方式是直接方位內(nèi)存的粪糙,并且對(duì)索引檢查進(jìn)行過優(yōu)化。
不過如果是使用NSMutableArray在遍歷過程中添加或刪除元素忿项,那么就只能使用for循環(huán)的方式了蓉冈,因?yàn)檫@時(shí)候結(jié)束的條件是變化的城舞,而for循環(huán)可以跟蹤這種變化。