3,Objective-C语法之字符串NSString

Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理。这两个类的最主要的区别是NSString创建赋值后不能动态修改长度和内容,除非给重新赋值。而NSMutableString类似与链表的,在创建赋值后可以进行修改长度,插入,删除等操作。

注:以下代码运行环境是:XCode 4.3.2 ,IOS 5.1。

NSString提供了许多创建和初始化新字符串的方法。下面这个是创建常量字符串的。 它是编译到可执行文件中的NSString的实例,它不会在内存中消失。例子:

1、创建常量字符串。

NSString *astring = @"我是字符串";

2、NSString的内存地址

当我们声明一个字符串时,NSString *aString;
变量aString并不是真正包含一个字符串对象,它是指向内存中字符串对象的指针,我们称之为对象标识符,因为它是表示内存中的一个对象而不是保存这个对象,指针是一个内存位置的地址,下面考虑用“==”来比较字符串,来看个例子

        NSString *string1 = @"我是甲一号";

        NSString *string2 = @"我是甲一号";

        BOOL result = string1==string2;

        if(result){

            NSLog(@"address:%p", string1);

            NSLog(@"address:%p", string2);

        }

运行打印结果:

2012-07-30 09:36:41.337 objectiveC[613:403] yiyang:0x10485b478

2012-07-30 09:36:41.339 objectiveC[613:403] yiyang:0x10485b478

说明result的值是YES,这里对比的是内存地址,@"我是甲一号"存储在文字常量区,string1和string2都指向这个字符串,所以指向的是同一个地址。


如果这样做
NSString *string1 = @"我是甲一号";
NSString *string2 = string1;
BOOL result = string1==string2;

这时候result的值也YES了

看个例子就明白了。下面是字符串内存地址的例子

[cpp]  view plain copy
  1. //内存指向  
  2.   NSString *bstring = @"我是字符串";  
  3.   NSString *astring = [[NSString alloc] init];  
  4.   NSLog(@"astring point address:0x%.8x", astring);  
  5.   NSLog(@"bstring point address:0x%.8x", bstring);  
  6.   astring=@"我是字符串";  
  7.   NSLog(@"重新赋值之后的astring point address:0x%.8x", astring);  
  8.   NSLog(@"astring:%@",astring);  
打印结果如下:

[cpp]  view plain copy
  1. 2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c  
  2. 2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc  
  3. 2012-06-14 11:35:31.227 NSString[2316:f803] 重新赋值之后的astring point address:0x000045bc  
  4. 2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字符串  

重新赋值后,astring 的地址和bstring地址一样了。

3、NSString字符串的比较

在NSString中,最直接的就是用isEqualTostring这个方法

[cpp]  view plain copy
  1. NSString* string1 = @"我是甲一号";  
  2.    NSString *string2 = @"我是甲一号";  
  3.    BOOL result = [string1 isEqualToString:string2];  
  4.    if (result) {  
  5.        NSLog(@"字符串相同");  
  6.    }  
打印结果:

[cpp]  view plain copy
  1. 2012-06-14 11:49:10.442 NSString[2481:f803] 字符串相同  

另外一个比较的方法:compare,他可以比较字符串的大小,它的返回类型是:NSOrderedAscending,NSorderedSame,NSorderedDescending(分别等于整数-1,0,1)。

[cpp]  view plain copy
  1. NSString* string1 = @"我是甲一号";  
  2.   NSString *string2 = @"我是甲一号";  
  3.   BOOL result = [string1 compare:string2];  
  4.   if (result == NSOrderedSame) {  
  5.       NSLog(@"字符串相同");  
  6.   }  

4、字符串分割:

[cpp]  view plain copy
  1. NSString *nstring = @"美国,加拿大,澳大利亚,津巴布韦,埃及";  
  2.     NSArray *array = [nstring componentsSeparatedByString:@","];  
  3.     for (int i = 0; i < [array count]; i++) {  
  4.         NSLog(@"string:%@", [array objectAtIndex:i]);  
  5.     }  

结果:

[cpp]  view plain copy
  1. 2012-06-14 11:49:10.443 NSString[2481:f803] string:美国  
  2. 2012-06-14 11:49:10.443 NSString[2481:f803] string:加拿大  
  3. 2012-06-14 11:49:10.443 NSString[2481:f803] string:澳大利亚  
  4. 2012-06-14 11:49:10.443 NSString[2481:f803] string:津巴布韦  
  5. 2012-06-14 11:49:10.444 NSString[2481:f803] string:埃及  

5、创建格式化字符串

[cpp]  view plain copy
  1. int a = 100;  
  2.  int b = 8;  
  3.  NSString *astring = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%d.这是第 %i 字符串",a,b]];  
  4.  NSLog(@"astring:%@",astring);  
格式化输出的符号

[cpp]  view plain copy
  1. %@     对象  
  2. %d, %i 整数  
  3. %u     无符整形  
  4. %f     浮点/双字  
  5. %x, %X 二进制整数  
  6. %o     八进制整数  
  7. %zu    size_t  
  8. %p     指针  
  9. %e     浮点/双字 (科学计算)  
  10. %g     浮点/双字  
  11. %s     C 字符串  
  12. %.*s   Pascal字符串  
  13. %c     字符  
  14. %C     unichar  
  15. %lld   64位长整数(long long)  
  16. %llu   无符64位长整数  
  17. %Lf    64位双字  
  18. %e 是实数,用科学计数法计的  

6、用标准c创建字符串:initWithUTF8String方法

[cpp]  view plain copy
  1. char *Cstring = "我是字符串";  
  2. NSString *astring = [[NSString alloc] initWithUTF8String:Cstring];  
  3. NSLog(@"astring:%@",astring);  
结果: 2012-06-14 13:47:23.956 NSString[2850:f803] astring: 我是字符串


7、在串中搜索子串和替换

hasPrefixe 匹配字符串头
haSuffix     匹配字符串的尾巴

[cpp]  view plain copy
  1. NSString *string1 = @"卡拉是条狗";  
  2.   NSString *string2 = @"狗狗叫卡拉";  
  3.   //字符串以开头比较  
  4.   if([string1 hasPrefix:@"卡拉"])  
  5.   {  
  6.       NSLog(@"字符串string1以卡拉开头");  
  7.   }  
  8.   //字符串以结尾比较  
  9.   if([string2 hasSuffix:@"卡拉"])  
  10.   {  
  11.       NSLog(@"string2字符串以卡拉结尾");  
  12.   }  


搜索和替换

[cpp]  view plain copy
  1. NSString *string = @"我们是 gong产 主义 接班人";  
  2. NSString *temp = @"gong产";  
  3. NSString *me = @"我";  
  4. NSRange rang = [string rangeOfString:temp];  
  5. NSRange rang1 = [string rangeOfString:me];  
  6.   
  7. NSLog(@"搜索的字符串在string中起始点的index 为 %d", rang.location);  
  8. NSLog(@"搜索的字符串在string中结束点的index 为 %d", rang.location + rang.length);  
  9. NSLog(@"我 在字符串 string中的起点的index  为 %d",rang1.location);  
  10.   
  11. //将搜索中的字符串替换成为一个新的字符串  
  12. NSString *str = [string stringByReplacingCharactersInRange:rang withString:@"大产"];  
  13. NSLog(@"替换后字符串为%@", str);  
  14.   
  15. //将字符串中" " 全部替换成 *  
  16. str = [string stringByReplacingOccurrencesOfString :@" " withString:@"*"];  
  17. NSLog(@"替换后字符串为%@", str);  

结果:

[cpp]  view plain copy
  1. 2012-06-14 14:07:44.762 NSString[3107:f803] 搜索的字符串在string中起始点的index 为 4  
  2. 2012-06-14 14:07:44.764 NSString[3107:f803] 搜索的字符串在string中结束点的index 为 9  
  3. 2012-06-14 14:07:44.764 NSString[3107:f803] 我 在字符串 string中的起点的index  为 0  
  4. 2012-06-14 14:07:44.765 NSString[3107:f803] 替换后字符串为我们是 大产 主义 接班人  
  5. 2012-06-14 14:07:44.765 NSString[3107:f803] 替换后字符串为我们是*gong产*主义*接班人  

看到"我"字的index了吗?第一位的索引值是0。


著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

你可能感兴趣的:(3,Objective-C语法之字符串NSString)