1.創(chuàng)建字符串對象
//1.通過字符串常量創(chuàng)建
//注意:如果是通過字符串常量創(chuàng)建對象,并且字符串常量的內(nèi)容一致,那么如果創(chuàng)建多個(gè)字符串對象,那么多個(gè)對象指向同一塊存儲空間,如果是通過字符串常量創(chuàng)建,那么字符串對象存儲在常量區(qū)中
NSString *str1 = @"lnj";
NSString *str11 = @"lnj";
NSLog(@"str1 = %p, str11 = %p", str1 ,str11);
//2.通過alloc init創(chuàng)建
//只要調(diào)用alloc就會(huì)在堆內(nèi)存中開辟一塊存儲空間,不同的編譯器存儲的方式也不一樣,如果是Xcode6以下并且是在iOS平臺,那么每次alloc都會(huì)創(chuàng)建一個(gè)新的對象,如果是在Xcode6以上那么alloc多次指向同一塊存儲空間
NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
NSLog(@"str2 = %p, str22 = %p", str2, str22);
//3.通過類工廠方法創(chuàng)建/ stringWithFormat
//內(nèi)部其實(shí)就是封裝了alloc init
NSString *str3 = [NSString stringWithFormat:@"zs"];
NSString *str33= [NSString stringWithFormat:@"zs"];
/*
也會(huì)存儲在常量區(qū)中,和通過字符串常量創(chuàng)建的完全相同
*/
NSString *str4 = [[NSString alloc]initWithString:@"ls"];
NSString *str44 = [[NSString alloc]initWithString:@"ls"];
NSLog(@"str4 = %p, str44 = %p", str4, str44);
2.字符串文件讀寫
(1)從文件中讀取字符串
NSString *path = @"/Users/taowai/Desktop/zf.rtf";
NSError *error = nil;
// 從文件中讀取字符串
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"str = %@", str);
}else
{
NSLog(@"error = %@", [error localizedDescription]);
}
(2)將字符串寫入到文件中
// 將字符串寫入到文件中
NSString *str = @"iOS0601基礎(chǔ)班";
// atomically 如果傳入YES, 字符串寫入文件的過程中如果沒有寫完, 那么不會(huì)生成文件
// 如果傳入NO, 字符串寫入文件的過程中如果沒有寫完, 會(huì)生成文件
NSString *path2 = @"/Users/taowai/Desktop/abc.txt";
BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"flag = %i", flag);
(3)創(chuàng)建URL
協(xié)議頭 + 主機(jī)地址 + 文件路徑
NSString *path = @"file://192.168.199.199/Users/NJ-Lee/Desktop/lnj.txt";
NSString *path = @"http://www.baidu.com";
//注意:如果加載的資源是本機(jī)上的資源,那么URL中的主機(jī)地址可以省略
//雖然主機(jī)地址可以省略,但是需要注意,文件路勁中最前面的/不能省略,文件路徑最前面的/代表根路徑
// NSString *path = @"file:///Users/NJ-Lee/Desktop/lnj.txt";
// NSURL *url = [NSURL URLWithString:path];
//注意:如果是通過NSURL的fileURLWithPath:方法創(chuàng)建URL,那么系統(tǒng)會(huì)自動(dòng)給我們傳入的字符串添加協(xié)議頭(file://),所以字符串中不需要再寫file://
// 注意:開發(fā)中一般情況下,如果是訪問本機(jī)的資源,創(chuàng)建URL的時(shí)候,建議使用fileURLWithPath方法創(chuàng)建
// 因?yàn)閡rl不支持中文,如果URL中包含中文,那么無法訪問;但是如果是通過fileURLWithPath方法創(chuàng)建URL,哪怕URL中包含中文也可以進(jìn)行訪問,系統(tǒng)內(nèi)部會(huì)自動(dòng)對URL中包含的中文進(jìn)行處理
NSURL *url = [NSURL fileURLWithPath:path];
(4)通過URL讀取文件
NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/lnj.txt";
//如果URL中包含中文,又非不通過fileURLWithPath創(chuàng)建,也可以破
//如果想破就必須在創(chuàng)建URL之前先對字符串中的中文進(jìn)行處理,進(jìn)行百分號編碼
NSLog(@"處理前:%@", path);
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"處理后:%@", path);
NSURL *url = [NSURL URLWithString:path];
NSLog(@"url = %@", url);
//2.根據(jù)URL加載文件中的字符串
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
(5)通過URL寫入文件
NSString *str = @"lnj";
// NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
// path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// NSURL *url = [NSURL URLWithString:path];
NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
NSURL *url = [NSURL fileURLWithPath:path];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
//注意點(diǎn):如果多次往同一個(gè)文件中寫入內(nèi)容,那么后一次的會(huì)覆蓋前一次的
NSString *str2 = @"xxoo";
[str2 writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
3.字符串比較
(1)比較兩個(gè)字符串是否相等
NSString *str1 = @"abc";
NSString *str2 = @"ABC";
// 比較兩個(gè)字符串的"內(nèi)容"是否相同
BOOL flag = [str1 isEqualToString:str2];
NSLog(@"flag = %i", flag);
// 下面這個(gè)方法, 是比較兩個(gè)字符串的"地址"是否相同
flag = (str1 == str2);
NSLog(@"flag = %i", flag);
(2)比較字符串的大小
// NSOrderedAscending 前面的小于后面的
// NSOrderedSame, 兩個(gè)字符串相等
// 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;
}
// 忽略大小寫進(jìn)行比較
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
4.字符串搜索
(1)判斷是否以什么開頭
// 本質(zhì)就是從字符串的第一個(gè)字符開始匹配, 只要不匹配就返回NO
if ([str hasPrefix:@"http://"]) {
NSLog(@"是一個(gè)URL");
}else
{
NSLog(@"不是一個(gè)URL");
}
(2)判斷是否以什么結(jié)尾
// 本質(zhì)就是從字符串的最后一個(gè)字符開始匹配, 只要不匹配就返回NO
if ([str hasSuffix:@".gif"]) {
NSLog(@"動(dòng)態(tài)圖片");
}else{
NSLog(@"不是動(dòng)態(tài)圖片");
}
(3)判斷字符串中是否包含a
NSString *str = @"abcd";
// 只要str中包含該字符串, 那么就會(huì)返回該字符串在str中的起始位置以及該字符串的長度
// location從0開始 , length從1開始
// 如果str中沒有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
NSRange range = [str rangeOfString:@"a"];
// if (range.location == NSNotFound) {
if (range.length == 0){
NSLog(@"str中沒有需要查找的字符串");
}else{
NSLog(@"str中有需要查找的字符串");
NSLog(@"location = %lu, length = %lu", range.location, range.length);
}
5.字符串截取
NSString *newStr = [str substringWithRange:range];
// 從什么地方開始截取, 一直截取到最后
NSString *newStr = [str substringFromIndex:6];
// 從開頭開始截取, 一直截取到什么位置
NSString *newStr = [str substringToIndex:6];
6.字符串替換
(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 whitespaceCharacterSet];
// NSString *newStr = [str stringByTrimmingCharactersInSet:set];
NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";
NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
NSString *newStr = [str stringByTrimmingCharactersInSet:set];
NSLog(@"newStr = |%@|", newStr);
// 去掉首尾空格和換行
NSString *str = [self.messages.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
7.字符串與路徑
(1)判斷是否是絕對路徑
// 其實(shí)本質(zhì)就是判斷字符串是否以/開頭
if([str isAbsolutePath])
{
NSLog(@"是絕對路徑");
}else{
NSLog(@"不是絕對路徑");
}
(2)獲取文件路徑中的最后一個(gè)目錄
// 本質(zhì)就是獲取路徑中最后一個(gè)/后面的內(nèi)容
NSString *newStr = [str lastPathComponent];
NSLog(@"%@", newStr);
(3)刪除文件路徑中的最后一個(gè)目錄
// 本質(zhì)就是刪除最后一個(gè)/后面的內(nèi)容, 包括/也會(huì)被刪除
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"%@", newStr);
(4)給文件路徑添加一個(gè)目錄
// 本質(zhì)就是在字符串的末尾加上一個(gè)/ 和指定的內(nèi)容
// 注意: 如果路徑后面已經(jīng)有了/, 那么就不會(huì)添加了
// 如果路徑后面有多個(gè)/, 那么會(huì)自動(dòng)刪除多余的/, 只保留一個(gè)
NSString *newStr = [str stringByAppendingPathComponent:@"xmg"];
NSLog(@"%@", newStr);
(5)獲取路徑中文件的擴(kuò)展名
// 本質(zhì)就是從字符串的末尾開始查找., 截取第一個(gè).后面的內(nèi)容
NSString *newStr = [str pathExtension];
NSLog(@"%@", newStr);
(6)刪除路徑中文件的擴(kuò)展名
// 本質(zhì)就是從字符串的末尾開始查找.,刪除第一個(gè).和.后面的內(nèi)容
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"%@", newStr);
(7)給文件路徑添加一個(gè)擴(kuò)展名
// 本質(zhì)就是在字符串的末尾加上一個(gè).和指定的內(nèi)容
NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
NSLog(@"%@", newStr);
8.字符串的轉(zhuǎn)換
(1)將字符串轉(zhuǎn)換為大寫
NSString *newStr = [str uppercaseString];
NSLog(@"%@", newStr);
(2)將字符串轉(zhuǎn)換為小寫
NSString *newStr2 = [newStr lowercaseString];
NSLog(@"%@", newStr2);
(3)將字符串的首字符轉(zhuǎn)換為大寫
NSString *newStr2 = [newStr capitalizedString];
NSLog(@"%@", newStr2);
(4)字符串與基本數(shù)據(jù)類型的轉(zhuǎn)換
NSString *str1 = @"110";
NSString *str2 = @"120";
// str1 + str2; // 錯(cuò)誤
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字符串之間的轉(zhuǎn)換
char *cStr = "lnj";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);
NSString *newStr = @"lmj";
const char *cStr2 = [newStr UTF8String];
NSLog(@"cStr2 = %s", cStr2);
9.分割字符串
NSArray *array = [str componentsSeparatedByString:@"+"];
str = array[2];