zoukankan      html  css  js  c++  java
  • OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象:

    http://blog.csdn.net/jiangwei0910410003/article/details/41788121

    那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString

    在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样。


    一、NSString对象

    在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类,和Java中的String类非常相似,而且他的一些方法也是很类似的。

    直接来看一下NSString的一些方法的使用:

    //
    //  main.m
    //  14_NSString
    //
    //  Created by jiangwei on 14-10-11.
    //  Copyright (c) 2014年 jiangwei. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //NSString是不可变字符串,后面还会降到可变字符串
            
            //1.--------------字符串的创建方式
            NSString *string1 = @"hello";
            NSLog(@"%@",string1);
            //和上面的方式是等价的
            string1 = [[NSString alloc] initWithString:@"hello1"];
            NSLog(@"%@",string1);
            //占位符,可以实现拼接字符串
            //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
            string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
            NSLog(@"%@",string1);
            //使用类方法创建字符串
            string1 = [NSString stringWithString:@"hello1"];
            
            
            //2.--------------字符串的比较isEqualToString
            //比较字符串的值
            NSString *string2 = @"abcd";
            NSString *string3 = @"8888";
            BOOL isEquals = [string2 isEqualToString:string3];
            if(isEquals){
            }else{
            }
            
            NSString *string8 = @"abc";
            NSString *string9 = @"abc";
            //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
            //string8和string9是局部变量,在栈中分配内存的
            if(string8 == string9){
                NSLog(@"string8 == string9");
            }else{
                NSLog(@"string8 != string9");
            }
            
            //下面的string11和string12还是在栈中分配内存的
            NSString *string11 = [[NSString alloc] initWithString:@"abc"];
            NSString *string12 = [[NSString alloc] initWithString:@"abc"];
            if(string11 == string12){
                NSLog(@"string11 == string12");
            }else{
                NSLog(@"string11 != string12");
            }
            
            //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了
            NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
            NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
            if(string13 == string14){
                NSLog(@"string13 == string14");
            }else{
                NSLog(@"string13 != string14");
            }
            
            //3.---------------------caseInsensitiveCompare方法
            //区分大小写判断是否相等
            NSString *string15 = @"zhangsan";
            NSString *string16 = @"ZAHNGSAN";
            NSComparisonResult result = [string15 caseInsensitiveCompare:string16];
            if(result == NSOrderedSame){
            }else{
            }
            
            
            //4.---------------------compare方法
            //比较两个字符串的大小
            result = [string15 compare:string16];
            if(result == NSOrderedAscending){
                //升序
            }else if(result == NSOrderedDescending){
                //降序
            }
            
            
            //5.---------------------length方法
            NSString *string17 = @"abc";
            NSInteger len = [string17 length];
            NSLog(@"len=%ld",len);
            
            
            //6.---------------------uppercaseString/lowercaseString
            //转成大写
            NSString *string18 = @"aEc";
            NSString *string19 = [string18 uppercaseString];
            string19 = [string18 lowercaseString];
            //首字符大写,其他的变成小写
            [string18 capitalizedString];
            
            
            //7.---------------------TypeXXXValue
            //数值转化方法
            NSString *string20 = @"3.14";
            float value = [string20 floatValue];
            string20 = @"1";
            BOOL values = [string20 boolValue];
            
            
            //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
            //字符串的截取
            NSString *string21 = @"abcdefg";
            //从开始位置截取到下标为3的字串(不包括3)
            NSString *stringnews = [string21 substringToIndex:3];
            //从哪个index开始截取到尾部(包括3)
            stringnews = [string21 substringFromIndex:3];
            //截取1~(3+1)部分的字串
            NSRange range = {1,3};
            stringnews = [string21 substringWithRange:range];
            
            
            //9.----------------------stringByAppendingString/stringByAppendingFormat
            //字符串的追加
            NSString *string22 = @"Android";
            NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
            stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];
            
            
            //10.---------------------rangeOfString
            //字符串的查找
            NSString *string23 = @"www.iphonetrain.com/ios.html";
            NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
            if(rang.location == NSNotFound){
                //没找到
            }else{
                //找到了
            }
            
            //11.----------------------characterAtIndex
            //取出字符串中指定的char
            NSString *string24 = @"abcdef";
            unichar c = [string24 characterAtIndex:3];
        
            
        }
        return 0;
    }
    


    下面来看一下他的方法:

    1、创建的方法

    //1.--------------字符串的创建方式
    NSString *string1 = @"hello";
    NSLog(@"%@",string1);
    //和上面的方式是等价的
    string1 = [[NSString alloc] initWithString:@"hello1"];
    NSLog(@"%@",string1);
    //占位符,可以实现拼接字符串
    //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
    string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
    NSLog(@"%@",string1);
    //使用类方法创建字符串
    string1 = [NSString stringWithString:@"hello1"];
    
    这里用了四种方式去创建一个字符串

    我们常用的方式一般是第一种

    第二种是对象方法创建的

    第三种是在创建字符串的时候可以实现字符串的拼接

    第四种是使用类的方法创建的


    2、比较字符串的值

    //2.--------------字符串的比较isEqualToString
    //比较字符串的值
    NSString *string2 = @"abcd";
    NSString *string3 = @"8888";
    BOOL isEquals = [string2 isEqualToString:string3];
    if(isEquals){
    }else{
    }
    这个方法简单,没什么好说的

    但是这个方法要和我们之前说到的==方式判断相等的方式区分,==和isEqual方法一样,比较指针变量是否指向同一个对象的,但是在OC中对于字符串有一个特殊的地方,下面来看一下代码:

    NSString *string8 = @"abc";
    NSString *string9 = @"abc";
    //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
    //string8和string9是局部变量,在栈中分配内存的
    if(string8 == string9){
        NSLog(@"string8 == string9");
    }else{
        NSLog(@"string8 != string9");
    }
    
    这里我们运行之后,发现用==判断也是相等的,这个原因和Java中的情形很相似,在Java中有一个常量池的概念,像这种方式创建的字符串,他们的值都是保存在一个常量池的,然后引用都是指向常量池中的那个对象,所以用==也是相等的,OC中的原因也是类似。

    但是在来看一下下面的代码:

    //下面的string11和string12还是在栈中分配内存的
    NSString *string11 = [[NSString alloc] initWithString:@"abc"];
    NSString *string12 = [[NSString alloc] initWithString:@"abc"];
    if(string11 == string12){
        NSLog(@"string11 == string12");
    }else{
        NSLog(@"string11 != string12");
    }
    我们发现用initWithString初始化方法创建的字符串他们的指针变量也是指向同一个对象的,所以这里要记住了,NSString类中的initWithString方法创建的字符串和NSString *str = @"demo"直接创建的方式是一样的,都是指向常量池中的一个对象。所以使用==判断是相等的,其他的NSString类中创建字符串的方法就不一样了,比如下面的代码:

    //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了
    NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
    NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
    if(string13 == string14){
        NSLog(@"string13 == string14");
    }else{
        NSLog(@"string13 != string14");
    }
    用initWithFormat初始化方法创建出来的对象就不想等了。

    所以要记住一点:initWithString初始化方法和直接创建字符串的效果一样,都是指向常量池中的NSString对象


    3、比较两个字符串的大小方法

    //4.---------------------compare方法
    //比较两个字符串的大小
    result = [string15 compare:string16];
    if(result == NSOrderedAscending){
        //升序
    }else if(result == NSOrderedDescending){
        //降序
    }

    4、字符串的长度的方法

    //5.---------------------length方法
    NSString *string17 = @"abc";
    NSInteger len = [string17 length];
    NSLog(@"len=%ld",len);


    5、转化字符串的大小写方法
    //6.---------------------uppercaseString/lowercaseString
    //转成大写
    NSString *string18 = @"aEc";
    NSString *string19 = [string18 uppercaseString];
    string19 = [string18 lowercaseString];
    //首字符大写,其他的变成小写
    [string18 capitalizedString];

    6、数值转化的方法

    //7.---------------------TypeXXXValue
    //数值转化方法
    NSString *string20 = @"3.14";
    float value = [string20 floatValue];
    string20 = @"1";
    BOOL values = [string20 boolValue];


    7、字符串的截取方法

    //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
    //字符串的截取
    NSString *string21 = @"abcdefg";
    //从开始位置截取到下标为3的字串(不包括3)
    NSString *stringnews = [string21 substringToIndex:3];
    //从哪个index开始截取到尾部(包括3)
    stringnews = [string21 substringFromIndex:3];
    //截取1~(3+1)部分的字串
    NSRange range = {1,3};
    stringnews = [string21 substringWithRange:range];

    8、字符串的追加方法

    //9.----------------------stringByAppendingString/stringByAppendingFormat
    //字符串的追加
    NSString *string22 = @"Android";
    NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
    stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];

    这里需要注意的是,每次追加完一个字符串之后,是返回一个新的字符串,因为NSString是不可变类。和Java中的String类很类似,如果用+去连接字符串都会重新创建一个字符串对象,Java中可以使用StringBuilder对象去解决这样的问题,在OC中也是有解决的,后面会说到一个可变字符串类


    9、字符串的查找方法

    //10.---------------------rangeOfString
    //字符串的查找
    NSString *string23 = @"www.iphonetrain.com/ios.html";
    NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
    if(rang.location == NSNotFound){
        //没找到
    }else{
        //找到了
    }


    11、取出字符串中指定的char

    //11.----------------------characterAtIndex
    //取出字符串中指定的char
    NSString *string24 = @"abcdef";
    unichar c = [string24 characterAtIndex:3];


    二、NSMutableString对象

    上面介绍了NSString对象的一些常用方法,但是OC中的NSString是不可变的对象,所以这里在介绍一下一个与其对应的可变对象:

    NSMutableString

    看一下代码:

    //
    //  main.m
    //  15_NSMutableString
    //
    //  Created by jiangwei on 14-10-12.
    //  Copyright (c) 2014年 jiangwei. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    //NSMutableString中的内容是可以修改的
    //NSMutableString是继承NSString类的
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //1.--------------------创建字符串
            //和NSString的创建方法相同
            NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"];
            
            //但是不能使用以下方式创建
            //因为以下方式创建的字符串是不可变的,其值是放到常量池中的,不可变得
            //NSMutableString *string1 = @"hello";
            
            
            //2.---------------------insertString
            //在源字符串中指定的index中插入字符串,不会产生新的对象
            [string1 insertString:@"可变" atIndex:0];
            
            
            //3.---------------------appendString
            //追加字符串,不会产生新的对象
            [string1 appendString:@"可变"];
            
            
            //4.---------------------deleteCharactersInRange
            //删除字符串中指定范围的字串内容
            NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
            NSRange range = {1,3};
            [string2 deleteCharactersInRange:range];
            
            
            //5.---------------------replaceCharactersInRange
            //替换字符串内容
            NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
            NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
            [string3 replaceCharactersInRange:ranges withString:@"ee"];
        }
        return 0;
    }
    
    这里主要是介绍了NSMutalbeString类和NSString类不同的地方


    1、创建方法

    NSMutableString类的创建方式和NSString的创建方式差不多,只是有一点需要注意,NSMutableString不能使用直接方式去创建,因为直接方式创建的字符串都是在常量池中,而常量池中的值都是不可变的,所以不能创建的,同时initWithString创建出来的字符串也是不在常量池中的。这点需要和NSString区分一下


    2、在字符串中插入一个字串

    //2.---------------------insertString
    //在源字符串中指定的index中插入字符串,不会产生新的对象
    [string1 insertString:@"可变" atIndex:0];

    3、字符串的追加

    //3.---------------------appendString
    //追加字符串,不会产生新的对象
    [string1 appendString:@"可变"];
    这个追加方法和NSString是不一样的,他不会产生一个字符串对象


    4、删除字串

    //4.---------------------deleteCharactersInRange
    //删除字符串中指定范围的字串内容
    NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
    NSRange range = {1,3};
    [string2 deleteCharactersInRange:range];

    5、替换字符串
    //5.---------------------replaceCharactersInRange
    //替换字符串内容
    NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
    NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
    [string3 replaceCharactersInRange:ranges withString:@"ee"];


    从上面的这些方法中,我们也可以看到NSMutableString类是可变的,因为只有可变字符串是有增删改查操作的


    总结

    这篇文章就介绍了Foundation框架中的字符串对象,有可变NSMutableString和不变NSString之分。












  • 相关阅读:
    v-model的实现原理
    面试技巧
    Vue中使用mui的tab-top-webview-main完成分类滑动栏出现兼容问题如何解决
    前端jquery面试题个人总结
    下拉复选框
    什么是BFC
    CSS控制文本自动换行
    CSS+DIV布局中absolute和relative区别
    2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面
    vue页面无操作10分钟内调转到登录页面
  • 原文地址:https://www.cnblogs.com/roccheung/p/5797301.html
Copyright © 2011-2022 走看看