IOS开发基础Object-C( 14)-- 字符串的使用方法

今天来给大家介绍一下 Foundation 框架关于字符串的使用方法,方法比较多,功能介绍我都写在代码里了。好了不多说了,上代码

 

我们来建立一个新的类 StringTest

我们来声明一下 StringTest.h

 

#import <Foundation/Foundation.h>

@interface StringTest : NSObject

+ (void) test;

@end


这里我们申明了一个 静态方法 test作为方法的入口,在main函数中进行调用,注意这里是静态方法

 

 

#import <Foundation/Foundation.h>

#import "StringTest.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        //类方法:
        //类方法(静态方法),程序运行之初,该方法就已经分配内存空间,类方法是属于公共空间之中的。
        //对象方法:
        //对象方法,在调用时才进行压栈处理。
        [StringTest test];//静态方法按照类名直接调用
        
    }
    return 0;
}

 

 

重点来了,下面我们来进行StringTest.m的实现,我在代码中都做了详细的注释,在这里我就不多赘述了。我们来看一下不可变字符串的用法

 

1、不可变字符串的创建

#pragma mark - 不可变字符串创建
/** 不可变字符串创建 */
+ (void)createString {
    
    //NSString 不可变是指字符串的内容和长度不可变
    
    //1.对不可变对象进行默认初始化是没有意义的
    NSString *string = [[NSString alloc] init];//没有意义
    NSLog(@"%p: %@",string,string);
    NSLog(@"%lu",[string length]);
    //2.这是创建不可变字符串最简化的方式
    //首先分配空间,然后把字符串存入,最后返回空间地址
    string = @"hello world";//重新创建了内存空间
    NSLog(@"%p: %@",string,string);
    
    /*
     运行结果:
     22016-01-04 10:09:12.187  字符串的使用[899:32212] StringTest
     2016-01-04 10:09:12.189  字符串的使用[899:32212] 0x7fff794b7bd0:
     2016-01-04 10:09:12.189  字符串的使用[899:32212] 0
     2016-01-04 10:09:12.189  字符串的使用[899:32212] 0x100001098: hello world
     */
    
    //系统不建议这样使用
    //NSString *string2 = [[NSString alloc] initWithString:@"hello world"];
    
    //OC字符串使用的是享元设计模式,可以节省内存资源
    //享元模式:字符串创建比较消耗内存资源,当创建一个字符串时,系统会把其放入缓冲区,下次使用相同的字符串常量时时无需再次创建新的对象
    
    NSString *string2 = @"hello world";
    
    NSLog(@"%p: %@",string2,string2);//如果两个字符串相等,则两个地址相等
    
    NSString *string3 = @"hello";
    
    NSLog(@"%p: %@",string3,string3);//两个字符串不相等,则地址不相等
    
    const char * cString = "utf-8 String";
    //3.C字符串 转 OC字符串
    string2 = [[NSString alloc] initWithCString: cString encoding: NSUTF8StringEncoding];
    //使用类方法来创建对象时,可以省去alloc
    string2 = [NSString stringWithCString: cString encoding: NSUTF8StringEncoding];
    
    //4.格式化字符串
    string2 = [[NSString alloc] initWithFormat:@"%@年%d月%d日",@"2016",1,4];
    NSLog(@"%@",string2);
    //字符串的拼接
    NSString *str1 = @"www.";
    NSString *str2 = @"baidu.com";
    NSString *str3 = [NSString stringWithFormat:@"%@%@",str1,str2];
    NSLog(@"str3 %@",str3);
    
    //格式化initWithFormat:是不会从字符串缓冲区中进行存取的
    //string2 = [[NSString alloc] initWithFormat:@"%@",@"hello"];
    string2 = @"hello";
    NSLog(@"%p: %@",string2,string2);
    NSString *string6 = [[NSString alloc] initWithFormat:@"%@",@"hello"];
    NSLog(@"%p: %@",string6,string6);
}

 

 

 

2、字符串的拼接和分割

** 字符串的拼接和分割 */
#pragma mark - 字符串的拼接和分割
+ (void)appendSeparatedString {
    
    //字符串的拼接
    //不可变字符串拼接后,会把新的字符串地址返回
    NSString *string = @"www.";
    //The string to append to the receiver. This value must not be nil.
    string = [string stringByAppendingString:@"baidu.com"];//传入的参数一定不能为空
    NSLog(@"string : %@",string);
    
    string = [string stringByAppendingString:@“百度网站"];
    NSLog(@"string :%@",string);
    
    //字符串的分割
    
    NSArray *components = [string componentsSeparatedByString:@"."];
    NSLog(@"%@",components);
    //按两个以上字符进行分割
    //从给定的字符串中读取字符,存入字符集和,以.和- 进行分割
    NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@".-"];
    components = [string componentsSeparatedByCharactersInSet:set];
    NSLog(@"%@",components);
    
    //获取子串
    string = @"www.baidu.com";
    //索引值从0开始,截取子串
    NSString *subString = [string substringFromIndex:4];
    NSLog(@"substring: %@",subString);
    /**
     * 2016-01-04 14:25:35.811  字符串的使用[3816:108976] substring: baidu.com
     */
    //不包含索引值对应的字符
    subString = [string substringToIndex:4];//注意,不要越界
    NSLog(@"substring: %@",subString);
    /**
     * 2016-01-04 14:28:41.554  字符串的使用[3833:109957] substring: www.
     */
    
    //从location位置开始往后数 length长度的字符
    subString = [string substringWithRange:NSMakeRange(4, 9)];
    NSLog(@"substring: %@",subString);
    /**
     *运行结果:
     *2016-01-04 14:31:34.492  字符串的使用[3846:110549] substring: baidu
     */
    
    //获取字符串的范围
    
    NSRange range = [string rangeOfString:@"com"];
    NSLog(@"location = %lu, length = %lu",range.location,range.length);//注意,这个.是结构体中的
    // location = 14, length = 3
}

 

3、字符串的比较方法

 

//** 字符串的比较方法*/
#pragma mark - 字符串的比较方法
+ (void)compareString {
    NSString *string1 = @"hello";
    NSString *string2 = @"hello";
    
    //比较的是地址
    if (string1 == string2) {
        NSLog(@"相等");
    }else {
        NSLog(@"不相等");
    }
    //直接比较是对对象地址进行的判断,不是判断对象本身
    NSString *string3 = [NSString stringWithFormat:@"%@",@"hello"];
    if (string1 == string3) {
        NSLog(@"相等");
    }else {
        NSLog(@"不相等");
    }
    
    //判断两个字符串相等 isEqualToString
    //hello
    //1.先判断地址是否相同,如果不同,执行第二步
    //2.判断长度是否一样,如果相同,执行3
    //3.逐个字符进行比较
    if ([string1 isEqualToString:string3]) {
        NSLog(@"相等");
    }else {
        NSLog(@"不相等");
    }
    //2.字符串的比较
    //不要在OC字符串中添加 "\0"
    string1 = @"abccc";
    string3 = @"ba";
    //根据字符的ASCII码来进行对比。从第一个字符开始,如果相等,比较下一个,如果不相等,返回比较结果
    //如果长度小的字符串中的字符,和长度大中的字符前几个都相同,最后比较结果,就是按长度来进行对比
    NSComparisonResult result = [string1 compare:string3];
    switch (result) {
        case NSOrderedAscending:
            NSLog(@"string1 < string3");
            break;
        case NSOrderedSame:
            NSLog(@"string1 = string3");
            break;
        case NSOrderedDescending:
            NSLog(@"string1 > string3");
            break;
        default:
            break;
    }
    //面试中
    //通过字符串比较方法来判断两个字符串对象是否相同
    string1 = nil;
    string3 = @"baidu";
    //为什么这里不用判断string3 为nil 。
    /**
     This value must not be nil. If this value is nil, the behavior is undefined and may change in future versions of OS X.
     */
    if (string1 && [string1 compare:string3] == NSOrderedSame) {
        NSLog(@"相同");
    }else {
        NSLog(@"不同");
    }
//    NSLog(@"%ld",(long)[string1 compare:string3]);
}

 

4、其他的一些方法

#pragma mark - 其他的一些方法
+ (void)otherMethods {
    
    NSString *string = @"www.baidu.com";
    NSLog(@"length = %lu",string.length);
    
    NSLog(@"Upper: %@",string.uppercaseString);//全部转化为大写
    NSLog(@"Lower: %@",string.lowercaseString);//全部转化为小写
    NSLog(@"Capitalized: %@",string.capitalizedString);//首字母大写
    
    BOOL result = [string hasPrefix:@"www."];//是否包含前缀
    BOOL result1 = [string hasSuffix:@".com"];//是否包含后缀
    
    //以后详细讲这个方法
    [string getCharacters:nil range:NSMakeRange(0, 0)];
}

 

5、可变字符串的使用

注意一点,NSMutableString 的父类是 NSString,很多用法基本和NSString一样,大家自己去研究

 

+ (void)mutableString {
    
//    NSMutableString 父类都是 NSString

//    可变指的是内存空间本身是可以更改的
//    1.创建一个空的可变字符串
    NSMutableString *string = [NSMutableString string];
    
    //string = @"123";//这是创建不可变字符串的方式
    
    [string setString:@"可变字符串"];
    
    //setString:每次赋值都会对原值进行全部覆盖
    [string setString:@"123"];
    
//    2.插入字符串
    [string insertString:@"可变字符串" atIndex:1];
    
//    3.在末尾追加字符串
    [string appendString:@"-baidu.com"];
//    4.删除操作
    //删除给定范围的字符
    [string deleteCharactersInRange:[string rangeOfString:@"23"]];
    //删除所有的字符
    //[string setString:@""];
    
    
//    5.修改字符串
    //1可变字符串-baidu.com
    //将 - 修改为 www.
    [string replaceCharactersInRange:NSMakeRange(6, 1) withString:@"www."];
    
    //注意:如果给定的范围长度要大于替换字符串的长度时,后面多出的部分会进行删除(先删除再插入)
    [string replaceCharactersInRange:NSMakeRange(6, 6) withString:@"www."];
    
    NSLog(@"string: %@",string);
    
    
}

 

6、测试方法

 

#import "StringTest.h"

@implementation StringTest

+(void)test {
    
    NSLog(@"%@",self);
    //[self createString];
    //[self appendSeparatedString];
    //[self compareString];
    //[self otherMethods];
    //NSString *string = @“cuixuerui”;
    //NSLog(@"%@",[string reverse]);
    [self mutableString];
}



@end

 

 

 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值