zoukankan      html  css  js  c++  java
  • Objective-C语法之字符串NSString

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

    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] address:0x10485b478

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

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

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

    这时候result的值也YES了

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

    复制代码
      //内存指向
        NSString *bstring = @"我是字符串";
        NSString *astring = [[NSString alloc] init];
        NSLog(@"astring point address:0x%.8x", astring);
        NSLog(@"bstring point address:0x%.8x", bstring);
        astring=@"我是字符串";
        NSLog(@"重新赋值之后的astring point address:0x%.8x", astring);
        NSLog(@"astring:%@",astring);
    复制代码

    打印结果如下:

    2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c
    2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc
    2012-06-14 11:35:31.227 NSString[2316:f803] 重新赋值之后的astring point address:0x000045bc
    2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字符串

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

    3、NSString字符串的比较

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

     NSString* string1 = @"我是甲一号";
        NSString *string2 = @"我是甲一号";
        BOOL result = [string1 isEqualToString:string2];
        if (result) {
            NSLog(@"字符串相同");
        }

    打印结果:2012-06-14 11:49:10.442 NSString[2481:f803] 字符串相同 

    4、字符串分割:

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

    结果:

    2012-06-14 11:49:10.443 NSString[2481:f803] string:美国
    2012-06-14 11:49:10.443 NSString[2481:f803] string:加拿大
    2012-06-14 11:49:10.443 NSString[2481:f803] string:澳大利亚
    2012-06-14 11:49:10.443 NSString[2481:f803] string:津巴布韦
    2012-06-14 11:49:10.444 NSString[2481:f803] string:埃及

    5、创建格式化字符串

       int a = 100;
        int b = 8;
        NSString *astring = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%d.这是第 %i 字符串",a,b]];
        NSLog(@"astring:%@",astring);

    格式化输出符号

    复制代码
    %@     对象
    %d, %i 整数
    %u     无符整形
    %f     浮点/双字
    %x, %X 二进制整数
    %o     八进制整数
    %zu    size_t
    %p     指针
    %e     浮点/双字 (科学计算)
    %g     浮点/双字
    %s     C 字符串
    %.*s   Pascal字符串
    %c     字符
    %C     unichar
    %lld   64位长整数(long long)
    %llu   无符64位长整数
    %Lf    64位双字
    %e 是实数,用科学计数法计的
    复制代码

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

        char *Cstring = "我是字符串";
        NSString *astring = [[NSString alloc] initWithUTF8String:Cstring];
        NSLog(@"astring:%@",astring);

    结果:2012-06-14 13:47:23.956 NSString[2850:f803] astring:我是字符串

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

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

    复制代码
      NSString *string1 = @"卡拉是条狗";
        NSString *string2 = @"狗狗叫卡拉";
        //字符串以开头比较
        if([string1 hasPrefix:@"卡拉"])
        {
            NSLog(@"字符串string1以卡拉开头");
        }
        //字符串以结尾比较
        if([string2 hasSuffix:@"卡拉"])
        {
            NSLog(@"string2字符串以卡拉结尾");
        }
    复制代码

    搜索和替换

    复制代码
        NSString *string = @"我们是 gong产 主义 接班人";
        NSString *temp = @"gong产";
        NSString *me = @"";
        NSRange rang = [string rangeOfString:temp];
        NSRange rang1 = [string rangeOfString:me];
        
        NSLog(@"搜索的字符串在string中起始点的index 为 %d", rang.location);
        NSLog(@"搜索的字符串在string中结束点的index 为 %d", rang.location + rang.length);
        NSLog(@"我 在字符串 string中的起点的index  为 %d",rang1.location);
        
        //将搜索中的字符串替换成为一个新的字符串
        NSString *str = [string stringByReplacingCharactersInRange:rang withString:@"大产"];
        NSLog(@"替换后字符串为%@", str);
        
        //将字符串中" " 全部替换成 *
        str = [string stringByReplacingOccurrencesOfString :@" " withString:@"*"];
        NSLog(@"替换后字符串为%@", str);
    复制代码
    复制代码
    结果:
    2012-06-14 14:07:44.762 NSString[3107:f803] 搜索的字符串在string中起始点的index 为 4 2012-06-14 14:07:44.764 NSString[3107:f803] 搜索的字符串在string中结束点的index 为 9 2012-06-14 14:07:44.764 NSString[3107:f803] 我 在字符串 string中的起点的index 为 0 2012-06-14 14:07:44.765 NSString[3107:f803] 替换后字符串为我们是 大产 主义 接班人 2012-06-14 14:07:44.765 NSString[3107:f803] 替换后字符串为我们是*gong产*主义*接班人
    复制代码

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

  • 相关阅读:
    类的再理解
    关于网络配置和zmp以及json
    PCL 库安装
    Ros学习注意点
    Ros集成开发环境配置
    《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
    《Effective C++》第1章 让自己习惯C++-读书笔记
    《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
    《TCP/IP详解卷1:协议》第1章 概述-读书笔记
    C++内存分配与对象构造的分离
  • 原文地址:https://www.cnblogs.com/hero11223/p/5647541.html
Copyright © 2011-2022 走看看