黑马程序员技术交流社区

标题: Foundation-不可变字符串 [打印本页]

作者: wangshengjie    时间: 2015-3-14 19:13
标题: Foundation-不可变字符串
本帖最后由 wangshengjie 于 2015-3-14 19:39 编辑

不可变字符串

在ObjC中字符串操作要比在C语言中简单的多,在下面的例子中你将看到字符串的初始化、大小写转化、后缀前缀判断、字符串比较、字符串截取、字符串转换等,通过下面的例子我们基本可以掌握常用的字符串操作(注意这些内容虽然基本,但却是十分常用的操作,需要牢记):

  1. //
  2. //  main.m
  3. //  FoundationFramework
  4. //
  5. //  Created by Kenshin Cui on 14-2-16.
  6. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>


  9. /**字符串操作*/
  10. void test1(){
  11.     char *str1="C string";//这是C语言创建的字符串
  12.     NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存

  13.     //下面的创建方法都应该释放内存
  14.     NSString *str3=[[NSString alloc] init];
  15.     str3=@"OC string";
  16.     NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
  17.     NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
  18.     NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C语言的字符串转换为ObjC字符串

  19.     //以上方法都有对应静态方法(一般以string开头),不需要管理内存(系统静态方法一般都是自动释放)
  20.     NSString *str7=[NSString stringWithString:@"Objective-C string"];
  21. }
  22. void test2(){
  23.     NSLog(@"\"Hello world!\" to upper is %@",[@"Hello world!" uppercaseString]);
  24.     //结果:"Hello world!" to upper is HELLO WORLD!
  25.     NSLog(@"\"Hello world!\" to lowwer is %@",[@"Hello world!" lowercaseString]);
  26.     //结果:"Hello world!" to lowwer is hello world!
  27.      
  28.     //首字母大写,其他字母小写
  29.     NSLog(@"\"Hello world!\" to capitalize is %@",[@"Hello world!" capitalizedString]);
  30.     //结果:"Hello world!" to capitalize is Hello World!
  31.      
  32.     BOOL result= [@"abc" isEqualToString:@"aBc"];
  33.     NSLog(@"%i",result);
  34.     //结果:0
  35.     NSComparisonResult result2= [@"abc" compare:@"aBc"];//如果是[@"abc" caseInsensitiveCompare:@"aBc"]则忽略大小写比较
  36.     if(result2==NSOrderedAscending){
  37.         NSLog(@"left<right.");
  38.     }else if(result2==NSOrderedDescending){
  39.         NSLog(@"left>right.");
  40.     }else if(result2==NSOrderedSame){
  41.         NSLog(@"left=right.");
  42.     }
  43.     //结果:left>right.
  44. }
  45. void test3(){
  46.     NSLog(@"has prefix ab? %i",[@"abcdef" hasPrefix:@"ab"]);
  47.     //结果:has prefix ab? 1
  48.     NSLog(@"has suffix ab? %i",[@"abcdef" hasSuffix:@"ef"]);
  49.     //结果:has suffix ab? 1
  50.     NSRange range=[@"abcdefabcdef" rangeOfString:@"cde"];//注意如果遇到cde则不再往后面搜索,如果从后面搜索或其他搜索方式可以设置第二个options参数
  51.     if(range.location==NSNotFound){
  52.         NSLog(@"not found.");
  53.     }else{
  54.         NSLog(@"range is %@",NSStringFromRange(range));
  55.     }
  56.     //结果:range is {2, 3}
  57. }
  58. //字符串分割
  59. void test4(){
  60.     NSLog(@"%@",[@"abcdef" substringFromIndex:3]);//从第三个索引开始(包括第三个索引对应的字符)截取到最后一位
  61.     //结果:def
  62.     NSLog(@"%@",[@"abcdef" substringToIndex:3]);////从0开始截取到第三个索引(不包括第三个索引对应的字符)
  63.     //结果:abc
  64.     NSLog(@"%@",[@"abcdef" substringWithRange:NSMakeRange(2, 3)]);
  65.     //结果:cde
  66.     NSString *str1=@"12.abcd.3a";
  67.     NSArray *array1=[str1 componentsSeparatedByString:@"."];//字符串分割
  68.     NSLog(@"%@",array1);
  69.      /*结果:
  70.       (
  71.          12,
  72.          abcd,
  73.          3a
  74.       )
  75.       */

  76. }
  77. //其他操作
  78. void test5(){
  79.     NSLog(@"%i",[@"12" intValue]);//类型转换
  80.     //结果:12
  81.     NSLog(@"%zi",[@"hello world,世界你好!" length]);//字符串长度注意不是字节数
  82.     //结果:17
  83.     NSLog(@"%c",[@"abc" characterAtIndex:0]);//取出制定位置的字符
  84.     //结果:a
  85.     const char *s=[@"abc" UTF8String];//转换为C语言字符串
  86.     NSLog(@"%s",s);
  87.     //结果:abc
  88. }

  89. int main(int argc, const char * argv[]) {
  90.     test1();
  91.     test2();
  92.     test3();
  93.     test4();
  94.     test5();
  95.     return 0;
  96. }
复制代码
注意:上面代码注释中提到的需要释放内存指的是在MRC下的情况,当然本质上在ARC下也需要释放,只是这部分代码编译器会自动创建。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2