NSString以及对字符串的增删改查

NSString

 

什么是NSString?

一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类

 

如何创建字符串对象

   

     通过不同的方式创建字符串,字符串对象储存的位置也不一样

     >如果是通过字符串常量创建,那么字符串对象存储在常量区中

     >如果是通过alloc initWithFormat/stringWithFormat创建,那么字符串对象存储在堆区中

     而且需要注意:

     >不同的平台存储的方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就是两个对象

     >不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次alloc都会创建一个新的对象,如果是在Xcode6以上那么alloc多次指向同一块存储空间

//1.通过字符串常量创建
    //注意:如果是通过字符串常量创建对象,并且字符串常量的内容一致,那么如果创建多个字符串对象,多个对象指向同一块存储空间
    NSString *str1 = @"lnj";
    NSString *str11 = @"lnj";
    NSLog(@"str1 = %p, str11 = %p", str1 ,str11);
    
    //2.通过alloc init创建
    //只要调用alloc就会在堆内存中开辟一块存储空间
    NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
    NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
    NSLog(@"str2 = %p, str22 = %p", str2, str22);
    
    //3.通过类工厂方法创建/ stringWithFormat
    //内部其实就是封装了alloc init
    NSString *str3 = [NSString stringWithFormat:@"zs"];
    NSString *str33= [NSString stringWithFormat:@"zs"];
    
    /*
     注意:一般情况下,只要是通过alloc或者类工厂方法创建的对象,每次都会在堆内存中开辟一块新的存储空间
     但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们
     而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
     */
    
    NSString *str4 = [[NSString alloc]initWithString:@"ls"];
    NSString *str44 = [[NSString alloc]initWithString:@"ls"];
    NSLog(@"str4 = %p, str44 = %p", str4, str44);

字符串读写上

问题1:如何从文件中读取字符串?什么是绝对路径?编码的常用格式是什么?错误信息是如何读取的?

/*
 file: 文件路径,
 encoding: 编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8
 error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil
 注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径)
 */
NSString *path = @"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
NSError *error = nil;

// 从文件中读取字符串
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {

NSLog(@"str = %@", str);
}else
{
    //localizedDescription 打印真正错误信息
    NSLog(@"error = %@", [error localizedDescription]);
}

问题2:如何将字符串写入到文件中?

SString *str = @"iOS0601基础班";
// atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件
//            如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt";
BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"flag = %i", flag);

字符串读写下(通过URL获取数据)

问题1:什么是URL?

答:

  1. URL的全称是Uniform Resource Locator(统一资源定位符)
  2. URL是互联网上标准资源的地址
  3. 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
  4. 根据一个URL就能找到唯一的一个资源

问题2:书写URL格式?

答: URL = 协议头://主机地址/路径

问题3:如何创建URL

    通过alloc 或者类工厂方法创建
    NSURL *url = [NSURL URLWithString:@"file:///Users/LNJ/Desktop/str.txt"];
    NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/LNJ/Desktop/str.txt"];
    通过文件路径创建(默认就是file协议的)
    NSURL *url = [NSURL fileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];

问题4:如何获取本地路径的信息?获取本地路径信息的方法有什么注意点?

答:获取本地路径信息--fileURLWithPath

方法一:


    1.字符串保存路径

    NSString *path = @"file://192.168.13.10/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
    NSLog(@"url编码前: %@", path);

2.将路径中中文转换为UTF-8编码格式

    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"url编码后: %@", path);

方法二:


    1.字符串保存路径,如果访问本机的文件, 可以省略主机地址

    NSString *path = @"file:///Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
    NSLog(@"url编码前: %@", path);

2.将路径中中文转换为UTF-8编码格式

   path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"url编码后: %@", path);

NSURL *url = [NSURL URLWithString:path];

 

3.获取本地路径的信息

    NSURL *url = [NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"];

NSError *error = nil;
    NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    if (error == nil) {

NSLog(@"str = %@", str);
    }else{
        NSLog(@"error = %@", [error localizedDescription]);
    }

注意点:

  • URLWithString: 方法不支持中文,所以无法成功创建URL,必须先对路径字符串进行编码
  • fileURLWithPath: 方法支持中文,并且省略协议头,但是只能获取本地方法

问题5:如何获取网络路径的信息?

答: 获取网络路径的信息--URLWithString

    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"str = %@", str);

 

问题6:如何将信息写入到指定文件?

答:

方法一:

    NSString *str = @"lnj";
    NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:path];

[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

方法二:

NSString *str = @"lnj";
NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
NSURL *url = [NSURL fileURLWithPath:path];

[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

总结:

  1. 如果多次往同一个文件中写入内容,那么后一次的会覆盖前一次的
  2. 方法名中没有file,路径中要添加上file协议头,如果方法名中有file,路径中就不需要file协议头

字符串比较

NSString *str1 = @"abc";
NSString *str2 = @"ABC";

问题1:如何比较两个字符串的"内容"是否相同?

答:

BOOL flag = [str1 isEqualToString:str2];
NSLog(@"flag = %i", flag);

问题2:如何比较两个字符串的"地址"是否相同?

flag = (str1 == str2);
NSLog(@"flag = %i", flag);

问题3:如何比较字符串的大小?

答:使用方法compare:

// NSOrderedAscending  前面的小于后面的
// NSOrderedSame,  两个字符串相等
// NSOrderedDescending  前面的大于后面的
switch ([str1 compare:str2]) {
    case NSOrderedAscending:
        NSLog(@"str1小于str2");
        break;
    case NSOrderedSame:
        NSLog(@"str1等于str2");
        break;
    case NSOrderedDescending:
        NSLog(@"str1大于str2");
        break;
    default:
        break;
}

问题4:如何忽略大小写进行比较?

答:

switch ([str1 caseInsensitiveCompare:str2]) {
    case NSOrderedAscending:
        NSLog(@"str1小于str2");
        break;
    case NSOrderedSame:
        NSLog(@"str1等于str2");
        break;
    case NSOrderedDescending:
        NSLog(@"str1大于str2");
        break;
    default:
        break;
}

 

字符串搜索

理解几个搜索字符串方法的本质

NSString *str = @"http://www.520it.com/img/lnj.gif";

问题1:如何判断字符串是以什么开头的?本质是什么?

答:

// 本质就是从字符串的第一个字符开始匹配, 只要不匹配就返回NO

if ([str hasPrefix:@"http://"]) {
    NSLog(@"是一个URL");
}else
{
    NSLog(@"不是一个URL");
}

问题2:如何判断字符串是否以什么结尾的?本质是什么?

答:

// 本质就是从字符串的最后一个字符开始匹配, 只要不匹配就返回NO

if ([str hasSuffix:@".gif"]) {
    NSLog(@"动态图片");
}else{
    NSLog(@"不是动态图片");
}

问题3:如何判断字符串中是否包含520it.com?本质是什么?

答:

NSString *str = @"abcd";
// 只要str中包含该字符串, 那么就会返回该字符串在str中的起始位置以及该字符串的长度
// location从0开始 , length从1开始
// 如果str中没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
NSRange range =  [str rangeOfString:@"lnj"];
//    if (range.location == NSNotFound) {
if (range.length == 0){
    NSLog(@"str中没有需要查找的字符串");
}else{
    NSLog(@"str中有需要查找的字符串");
    NSLog(@"location = %lu, length = %lu", range.location, range.length);
}

字符串截取

OC中的结构体,使用什么开头的方法创建

NSString *str = @"<head>小码哥</head>";

问题1:如何获取指定范围内的字符串?

答:

1.动态获取截取的起始位置

NSUInteger location = [str rangeOfString:@">"].location + 1;

2.动态获取截取的长度

// 注意:rangeOfString是从左至右的开始查找, 只要找到就不找了
NSUInteger length = [str rangeOfString:@"</"].location - location;
NSRange range = NSMakeRange(location, length);

NSString *newStr = [str substringWithRange:range];
NSLog(@"str = %@", str);
NSLog(@"newStr = %@", newStr);

问题2:如何截取字符串?

答:

/*
 <head>小码哥</head> --> 小码哥</head>  --> 小码哥
 <head>小码哥</head> --> <head>小码哥  --> 小码哥
 */

NSUInteger location = [str rangeOfString:@">"].location + 1;
NSString *newStr = [str substringFromIndex:location];
NSLog(@"newStr = %@", newStr);

location = [newStr rangeOfString:@"</"].location;
// 改变了指针的指向, 并不是修改了原来的字符串
newStr = [newStr substringToIndex:location];
NSLog(@"newStr = %@", newStr);

字符串替换

了解字符串替换方法,和怎么填方法中的参数

stringByReplacingOccurrencesOfString:
stringByTrimmingCharactersInSet:

问题1:如何替换字符串中的部分字符?

答:

//需求: 将&符号替换为/
NSString *str = @"http:&&www.520it.com&img&lnj.gif";
// OccurrencesOfString: 要替换谁
// withString: 用谁替换
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
NSLog(@"newStr = %@", newStr);

 

问题2:如何对字符串首位进行处理?

答:

NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";

NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
NSString *newStr = [str stringByTrimmingCharactersInSet:set];
NSLog(@"newStr = |%@|", newStr);

字符串和路径

获取路径方法的本质

NSString *str = @"User/lnj/Desktop/lnj.txt.jpg";

问题1:如何判断是否是绝对路径?

答:

  • 其实:本质就是判断字符串是否以/开头
    if([str isAbsolutePath])
    {
      NSLog(@"是绝对路径");
    }else{
      NSLog(@"不是绝对路径");
    }

问题2:如何获取文件路径中的最后一个目录?

答: 本质:就是获取路径中最后一个/后面的内容

NSString *newStr = [str lastPathComponent];
NSLog(@"%@", newStr);

 

问题3:如何删除文件路径中的最后一个目录?

答:

  • 本质:就是删除最后一个/后面的内容, 包括/也会被删除
    NSString *newStr = [str stringByDeletingLastPathComponent];
    NSLog(@"%@", newStr);

问题4:如何给文件路径添加一个目录?

答:

  • 本质:就是在字符串的末尾加上一个/ 和指定的内容
  • 注意: 如果路径后面已经有了/, 那么就不会添加了
  • 如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
NSString *newStr = [str stringByAppendingPathComponent:@"xmg"];
NSLog(@"%@", newStr);

 

问题5:如何获取路径中文件的扩展名?

答:

  • 本质:就是从字符串的末尾开始查找., 截取第一个.后面的内容
    NSString *newStr = [str pathExtension];
    NSLog(@"%@", newStr);

问题6:如何删除路径中文件的扩展名?

答:

  • 本质就是从字符串的末尾开始查找.,删除第一个.和.后面的内容
    NSString *newStr = [str stringByDeletingPathExtension];
    NSLog(@"%@", newStr);

问题7:如何给文件路径添加一个扩展名?

答:

  • 本质:就是在字符串的末尾加上一个.和指定的内容
    NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
    NSLog(@"%@", newStr);

问题1:如何将将字符串转换为大写?

答:

NSString *newStr = [str uppercaseString];
NSLog(@"%@", newStr);

 

问题2:如何将字符串转换为小写?

答:

NSString *newStr2 = [newStr lowercaseString];
NSLog(@"%@", newStr2);

 

htpp://www.520it.com/img/lnj.GIF;

问题3:如何将字符串的首字符转换为大写

答:

NSString *newStr = [str capitalizedString];
NSLog(@"%@", newStr);

 

问题4:如何字符串与基本数据类型的转换?

答:

NSString *str1 = @"110";
NSString *str2 = @"120";
//    str1 + str2; // 错误
int value1 = [str1 intValue];
int value2 = [str2 intValue];
NSLog(@"sum = %i", value1 + value2);

// 注意: 如果不是int,double,float,bool,integer,longlong这些类型就不要乱用
NSString *str3 = @"abc";
int value3 = [str3 intValue];
NSLog(@"value3 = %i", value3);

问题5:如何C语言字符串和OC字符串之间的转换?

答:

char *cStr = "lnj";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);

NSString *newStr = @"lmj";
const char *cStr2 = [newStr UTF8String];
NSLog(@"cStr2 = %s", cStr2);

 

 

原文地址:https://www.cnblogs.com/dreamWanweidong/p/4998682.html