版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.21 |
前言
前面我簡單的寫了些NSString的初始化,寫了幾篇替梨,都不難副瀑,但是可以對新手有一定的小幫助俗扇,對于大神級人物可以略過這幾篇铜幽,NSString本來就沒有難的除抛,都是細枝末節(jié)到忽,忘記了查一下就會了,沒有技術(shù)難點华烟,下面我們繼續(xù)~~~
1. NSString簡單細說(一)—— NSString整體架構(gòu)
2. NSString簡單細說(二)—— NSString的初始化
3. NSString簡單細說(三)—— NSString初始化
4. NSString簡單細說(四)—— 從URL初始化
5. NSString簡單細說(五)—— 向文件或者URL寫入
6.NSString簡單細說(六)—— 字符串的長度
7. NSString簡單細說(七)—— 與C字符串的轉(zhuǎn)化
8. NSString簡單細說(八)—— 識別和比較字符串
9. NSString簡單細說(九)—— 字符串的合并
10. NSString簡單細說(十)—— 字符串的分解
11. NSString簡單細說(十一)—— 字符串的查找
12. NSString簡單細說(十二)—— 字符串的替換
13. NSString簡單細說(十三)—— 字符串的分行和分段
14. NSString簡單細說(十四)—— 字符串位置的計算
15. NSString簡單細說(十五)—— 字符串轉(zhuǎn)化為propertyList
16. NSString簡單細說(十六)—— 畫字符串
17. NSString簡單細說(十七)—— 字符串的折疊和前綴
18. NSString簡單細說(十八)—— 字符串中大小寫子母的變換
19. NSString簡單細說(十九)—— 根據(jù)映射獲取字符串
20. NSString簡單細說(二十)—— 獲取字符串的數(shù)值
21. NSString簡單細說(二十一)—— 字符串與編碼
22. NSString簡單細說(二十二)—— 與路徑相關(guān)(一)
這一篇我們說一下與路徑相關(guān)。
一喂链、@property(readonly, copy) NSString *stringByAbbreviatingWithTildeInPath;
該方法的作用就是用波浪號(?)字符替換當前路徑的當前主目錄部分椭微。下面我們還是直接看代碼蝇率。
- (void)demoStringByAbbreviatingWithTildeInPath
{
NSString *f1 = [NSHomeDirectory() stringByAppendingPathComponent:@"ReadMe.txt"];
NSLog(@"路徑:%@", f1);
NSLog(@"路徑:%@", f1.stringByAbbreviatingWithTildeInPath);
}
下面我們看輸出結(jié)果
2017-08-21 18:50:59.616048+0800 JJOC[10790:5137362] 路徑:/var/mobile/Containers/Data/Application/E875AE5E-0B15-4460-B728-448E1BB1CC0C/ReadMe.txt
2017-08-21 18:50:59.616174+0800 JJOC[10790:5137362] 路徑:~/ReadMe.txt
還有幾點需要注意:
- 基于當前字符串對象的新字符串瓢剿。 如果新字符串指定了當前主目錄中的文件间狂,路徑的主目錄部分將被替換為波浪號(?)字符鉴象。 如果字符串未在當前主目錄中指定文件纺弊,則此方法返回一個新的字符串對象淆游,該對象的路徑與當前字符串中的路徑不變犹菱。
- 請注意腊脱,此方法僅適用于文件路徑陕凹。 它不適用于URL的字符串表示。
- 對于MacOS中的沙盒應(yīng)用程序搜骡,當前主目錄與用戶的主目錄不同浆兰。 對于沙盒應(yīng)用程序,主目錄是應(yīng)用程序的主目錄榕订。 因此劫恒,如果您為沙盒應(yīng)用程序指定了
/Users/<current_user>/file.txt
的路徑琴拧,則返回的路徑將與原始路徑保持不變挨稿。 但是你稚,如果您為不在沙箱中的應(yīng)用程序指定了相同的路徑贰您,則此方法將以波形符代替路徑的/ Users / <current_user>
部分。
結(jié)論:很好理解舶替,用的地方并不多顾瞪。
二陈醒、- (NSString *)stringByAppendingPathComponent:(NSString *)str;
該方法的作用是為路徑增加一個component
孵延。下面還是直接看代碼尘应。
//擴展路徑
- (void)demoStringByAppendingPathComponent
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
NSLog(@"path = %@", path);
NSLog(@"%@", [path stringByAppendingPathComponent:@"abc"]);
}
下面看輸出結(jié)果
2017-08-21 19:04:07.951473+0800 JJOC[10798:5140461] path = /var/containers/Bundle/Application/5B981BEC-6050-4098-A840-F9041444805E/JJOC.app/1.gif
2017-08-21 19:04:07.951576+0800 JJOC[10798:5140461] /var/containers/Bundle/Application/5B981BEC-6050-4098-A840-F9041444805E/JJOC.app/1.gif/abc
這里還有幾點需要注意:
- 請注意犬钢,此方法僅適用于文件路徑(不是,例如URL的字符串表示)混滔。
- 下標給出了不同輸入添加路徑得到的不同輸出坯屿。
輸入 | 輸出 |
---|---|
/tmp | /tmp/scratch.tiff |
/tmp/ | /tmp/scratch.tiff |
/ | /scratch.tiff |
an empty string/ | scratch.tiff |
結(jié)論:這個經(jīng)常用到领跛,需要理解熟記吠昭。
三矢棚、- (NSString *)stringByAppendingPathExtension:(NSString *)str;
該方法的作用就是返回一個新的字符串蒲肋,通過向接收者附加一個擴展分隔符肉津,后跟一個給定的擴展名妹沙。
下面我們還是看代碼吧距糖。
//擴展類型
- (void)demoStringByAppendingPathExtension
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
NSLog(@"path = %@", path);
NSLog(@"%@", [path stringByAppendingPathExtension:@"ppngg"]);
}
下面看輸出結(jié)果
2017-08-21 22:29:11.881 JJOC[1574:33505] path = /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Bundle/Application/41E8CD6A-DA07-45A9-B384-8C7C7BD2AA1A/JJOC.app/1.gif
2017-08-21 22:29:11.881 JJOC[1574:33505] /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Bundle/Application/41E8CD6A-DA07-45A9-B384-8C7C7BD2AA1A/JJOC.app/1.gif.ppngg
這里還有幾點需要注意:
- 請注意悍引,此方法僅適用于文件路徑(不是帽氓,例如URL的字符串表示)黎休。
- 在
OS X v10.9
之前,此方法不允許您將文件擴展名添加到以波浪符號(?)開頭的文件名联贩。 - 下面看這個表格就是對應(yīng)不同的路徑添加擴展的結(jié)果盲厌,假設(shè)擴展是
@"tiff"
祸泪。
輸入 | 輸出 |
---|---|
/tmp/scratch.old | /tmp/scratch.old.tiff |
/tmp/scratch. | /tmp/scratch..tiff |
/tmp/ | /tmp.tiff |
scratch | scratch.tiff |
請注意拓萌,將擴展名添加到@“/ tmp /”
會導致結(jié)果為@“/ tmp.tiff”
而不是@“/ tmp / .tiff”
。 這個區(qū)別是因為一個名為@“.tiff”
的文件不被認為有一個擴展名屡限,所以字符串被附加到最后一個非空路徑組件翰撑。
結(jié)論:這個并不難眶诈。
四逝撬、@property(readonly, copy) NSString *stringByDeletingLastPathComponent;
該屬性的作用就是:通過從接收器中刪除最后一個路徑組件宪潮,以及任何最終的路徑分隔符創(chuàng)建的一個新字符串狡相。
下面還是直接看代碼尽棕。
//刪除最后一個路徑
- (void)demoStringByDeletingLastPathComponent
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
NSLog(@"path = %@", path);
NSLog(@"%@", [path stringByDeletingLastPathComponent]);
}
下面看輸出結(jié)果
2017-08-21 22:53:02.312 JJOC[2147:49535] path = /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Bundle/Application/BCD71889-EC28-4716-B1EA-5DDFE4AFF59E/JJOC.app/1.gif
2017-08-21 22:53:02.312 JJOC[2147:49535] /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Bundle/Application/BCD71889-EC28-4716-B1EA-5DDFE4AFF59E/JJOC.app
還要幾點需要注意:
- 通過從傳入的參數(shù)中刪除最后一個路徑組件滔悉,以及任何最終的路徑分隔符創(chuàng)建的一個新字符串日戈。 如果接收器表示根路徑孙乖,則返回不變唯袄。
- 請注意恋拷,此方法僅適用于文件路徑(不是例如URL的字符串表示)蔬顾。
- 下表說明了此方法對各種不同路徑的影響:
輸入 | 輸出 |
---|---|
/tmp/scratch.tiff | /tmp |
/tmp/lock/ | /tmp |
/tmp/ | / |
/tmp | / |
/ | / |
scratch.tiff | an empty string |
結(jié)論:還好理解窄刘。
五、@property(readonly, copy) NSString *stringByExpandingTildeInPath;
該屬性的作用是:通過將接收器的初始組件擴展到其完整路徑值來創(chuàng)建的新字符串翻伺。
下面我們看代碼沮焕。
- (void)demoStringByExpandingTildeInPath
{
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ReadMe.txt"];
NSLog(@"路徑:%@", path);
NSLog(@"路徑:%@", path.stringByAbbreviatingWithTildeInPath);
NSLog(@"%@", path.stringByExpandingTildeInPath);
}
下面看輸出結(jié)果
2017-08-21 23:24:24.390 JJOC[3211:73687] 路徑:/Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/BCDC66FA-4D79-407A-BBEB-1CA62D5D27D1/ReadMe.txt
2017-08-21 23:24:24.391 JJOC[3211:73687] 路徑:~/ReadMe.txt
2017-08-21 23:24:24.391 JJOC[3211:73687] /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/BCDC66FA-4D79-407A-BBEB-1CA62D5D27D1/ReadMe.txt
這里還有幾點需要注意:
- 如果以“?”或“?user”開頭的擴展接收器的初始組件,則將其全部路徑值擴展為新的字符串络它。 如果接收者的初始組件無法展開化戳,則返回與接收器匹配的新字符串点楼。
- 請注意扫尖,此方法僅適用于文件路徑(不是例如URL的字符串表示)。
結(jié)論:有了前面的基礎(chǔ)掠廓,這個也還算好理解换怖。
六、@property(readonly, copy) NSString *stringByResolvingSymlinksInPath;
該屬性的作用就是:通過解析所有符號鏈接和標準化路徑蟀瞧,從接收器創(chuàng)建一個新字符串沉颂。將路徑中的代字符擴展成用戶主目錄()或指定用戶的主目錄(user) 。
下面看代碼悦污。
- (void)demoStringByResolvingSymlinksInPath
{
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ReadMe.txt"];
NSLog(@"路徑:%@", path);
NSLog(@"路徑:%@", path.stringByAbbreviatingWithTildeInPath);
NSLog(@"%@", path.stringByResolvingSymlinksInPath);
}
下面看輸出結(jié)果
2017-08-21 23:42:03.016 JJOC[4004:89888] 路徑:/Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/CC9EA6F7-C434-475E-B118-BB35F4B4BD3B/ReadMe.txt
2017-08-21 23:42:03.017 JJOC[4004:89888] 路徑:~/ReadMe.txt
2017-08-21 23:42:03.017 JJOC[4004:89888] /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/CC9EA6F7-C434-475E-B118-BB35F4B4BD3B/ReadMe.txt
還有幾點需要注意:
- 一個新的字符串铸屉,通過解析所有符號鏈接,然后刪除無關(guān)的路徑組件切端。 對于絕對路徑,保證所有符號鏈接被刪除怠益。 對于相對路徑偏陪,無法解析的符號鏈接在返回的字符串中未解決饥脑,如果發(fā)生錯誤刷钢,返回自身赋除。
- 請注意颁糟,此方法僅適用于文件路徑(不是例如URL的字符串表示)粥惧。
結(jié)論:路徑字符串的解析惹想。
七辰狡、@property(readonly, copy) NSString *stringByStandardizingPath;
該屬性的作用就是:通過從接收器中去除多余路徑組件而制成的新字符串。也可以這么理解:通過嘗試解析~、..(父目錄符號)、.(當前目錄符號)和符號鏈接來標準化路徑蛇更。
下面還是看代碼师逸。
- (void)demoStringByStandardizingPath
{
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ReadMe.txt"];
NSLog(@"路徑:%@", path);
NSLog(@"路徑:%@", path.stringByAbbreviatingWithTildeInPath);
NSLog(@"%@", path.stringByStandardizingPath);
}
下面看輸出結(jié)果员辩。
2017-08-21 23:51:26.727 JJOC[4362:100560] 路徑:/Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/119EC48D-DA4C-465F-8E29-BD9610A9F82F/ReadMe.txt
2017-08-21 23:51:26.728 JJOC[4362:100560] 路徑:~/ReadMe.txt
2017-08-21 23:51:26.728 JJOC[4362:100560] /Users/lucy/Library/Developer/CoreSimulator/Devices/62A73A14-39A7-4BB4-8A4C-E997EF88CDB4/data/Containers/Data/Application/119EC48D-DA4C-465F-8E29-BD9610A9F82F/ReadMe.txt
這里還有幾點注意:
- 請注意讼油,此方法返回的路徑仍可能具有符號鏈接組件瘦赫。 還要注意蝉娜,此方法僅適用于文件路徑(不是例如URL的字符串表示)荧呐。
- 通過執(zhí)行以下操作創(chuàng)建的新字符串:
- 使用
stringByExpandingTildeInPath
擴展初始波形符號表達式。 - 如果結(jié)果仍然指示現(xiàn)有文件或目錄(通過查詢文件系統(tǒng)進行檢查),則從路徑中刪除
“/ private / var / automount”
奉呛,“/ var / automount”
或“/ private”
的初始組件呐萌。 - 減少空組件和對當前目錄(即序列“//”和“/./”)的引用到單路徑分隔符赠堵。
- 從最后一個組件中刪除尾部斜線。
- 僅對于絕對路徑朽缎,如果可能,使用
stringByResolvingSymlinksInPath
解析對父目錄(即組件“..”)的引用肤粱。 對于相對路徑践磅,對父目錄的引用保留疟暖。
- 使用
結(jié)論::這個我都沒用過邻遏。
八另锋、- (NSArray<NSString *> *)stringsByAppendingPaths:(NSArray<NSString *> *)paths;
該方法的作用就是:返回一個字符串數(shù)組赏殃,通過單獨附加到接收器中給定數(shù)組中的每個字符串物蝙。
我們先看一下參數(shù)和返回值:
- paths : 一組NSString對象票堵,指定要添加到接收器的路徑。
- return : 通過將路徑中的每個字符串單獨附加到接收器而制作的NSString對象數(shù)組捧存,如果必要昔穴,則由路徑分隔符引導卿操。
下面我們還是直接看代碼镶奉。
- (void)demoStringsByAppendingPaths
{
NSArray *arr = @[@"lucy", @"Developer", @"CoreSimulator"];
NSArray *resultArr = [@"Users" stringsByAppendingPaths:arr];
NSLog(@"resultArr = %@", resultArr);
}
下面我們看輸出結(jié)果
2017-08-22 00:20:31.557 JJOC[5772:127375] resultArr = (
"Users/lucy",
"Users/Developer",
"Users/CoreSimulator"
)
這里還有一點需要注意:此方法僅適用于文件路徑(不是例如URL的字符串表示)茅坛。 有關(guān)一個示例祟剔,請參閱stringByAppendingPathComponent:
。
結(jié)論:這個我也基本不用摩梧。
后記
未完,待續(xù)~~~