NSString学习
- 基本概念
- NSString是以UTF-16 code uint的序列。所有的长度、字符、范围都是以16比特platform-endian(大端序小段序基于平台)的形式表示的。
所以,一个英文字母的长度是1,一个汉字的长度也是1,而emoji表情的长度可能是2,3,4等等。 - NSString可以从c缓冲区、NSdata对象以及NSUrl的内容中生成,也可以转化为这些内容。可以在ASCII、UTF-8、UTF-16、UTF-32以及其他编码格式之间转换。
- NSString是以UTF-16 code uint的序列。所有的长度、字符、范围都是以16比特platform-endian(大端序小段序基于平台)的形式表示的。
- 关于字符
- NSString的两个基本方法是
- (unichar)characterAtIndex:(NSUInteger)index
及@property(readonly) NSUInteger length
。 - 对于字符串的比较、查找等等都是以字符为基础的。也就是说比较时,是挨个字符(character)比较的。
unichar
是UTF-16编码单位。typealias unichar = UInt16
- NSString的两个基本方法是
- 解析UTF-16数据
当解析UTF-16数据(也就是比特数组按照UTF-16的格式解析),如果没有BOM(byte-order mark)指定端序,那么默认是大端序。 - 子类、object composition与category
- 实现NSString的子类,需要实现NSString的backing store(可以是静态数组、动态分配的数组或者其他的数据形式)、
length
方法与charAtIndex
方法。 - 另一个选择是声明一个类,将NSString作为一个属性,并将需要的其它的metadata也作为属性存储在类中。并实现需要用到的NSString的方法(其实就是调用这个类NSString属性的方法)及其他方法。
- category。 对所有的NSString对象都会起作用,有时会有导致意想不到的效果。不过可以增加NSString的功能。
- 实现NSString的子类,需要实现NSString的backing store(可以是静态数组、动态分配的数组或者其他的数据形式)、
- 生成NSString的方法
- 从比特数组中生成
- (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
从指定长度的比特数组中以指定的编码格式解析得到NSString。当len比比特数组的长度还长时,返回nil。 - 从
unichar
数组中生成。
- (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
- 从C字符串中的生成
- (instancetype)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
由于C字符串是以NULL终结的,所以字符串中不能有NULL。所以编码格式只能是8比特为基础的,因为比8比特宽的字符格式(比如UTF-16),一个编码单位可能有NULL比特。 - 从参数创建
- (instancetype)initWithFormat:(NSString *)format locale:(id)locale arguments:(va_list)argList;
- 从NSData创建
- (instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
从data
中,按照encoding
解析,得到UTF-16的code unit序列。 - 从文件中创建
- 以指定编码格式创建
- (instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
如果文件打不开或者编码错误,返回nil。 - 从文件中创建,并返回解析用的编码格式
- (instancetype)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError * _Nullable *)error;
编码格式以指针方式返回。
- 以指定编码格式创建
- 从URL中创建
- 以指定编码格式创建
- (instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
- 返回解析用的编码格式
- (instancetype)initWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError * _Nullable *)error;
- 以指定编码格式创建
- 从比特数组中生成
写到文件或URL中
- 写到文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
如果useAuxiliaryFile
是YES
,那么会生成一个临时的文件,把String写到这个文件中,然后将这个文件重命名为目标文件。这保证了及时系统crash,也不会导致已存在的文件(如果存在)会损坏。
这个方法把编码信息存储在文件的扩展属性中,名字是com.apple.TextEncodin
,值是编码的IANA名字+分号+编码格式的CFStringEncoding值。从文件里生成字符串时,也是用这些个信息来决定编码格式的。例如- MACINTOSH;0
- UTF-8;134217984
- UTF-8;
- ;3071
dd = @"d";
NSString *file = [NSHomeDirectory() stringByAppendingPathComponent:@"test"];
NSError *error = nil;
[dd writeToFile:file atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (nil == error)
{
NSLog(@"write success");
}
NSDictionary *attrbuteDict = [[NSFileManager defaultManager] attributesOfItemAtPath:file error:&error];
NSDictionary *extendAtt = [attrbuteDict objectForKey:@"NSFileExtendedAttributes"];
NSData *attrData = [extendAtt objectForKey:@"com.apple.TextEncoding"];
NSString *attrStr = [[NSString alloc] initWithData:attrData encoding:NSUTF8StringEncoding];

- 写到URL中去- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
- 写到文件中
获取长度
- 获取UTF-16 code unit长度
@property(readonly) NSUInteger length
。不是打印出来字符的长度。 - 使用某种编码格式编码,比特数组的长度。
- (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc;
时间复杂度O(n)

- 使用某种格式编码,比特数组的不精确上界。
- (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc;
。时间复杂度O(1).
- 获取UTF-16 code unit长度
获取UTF-16编码单位的数组
- (void)getCharacters:(unichar *)buffer range:(NSRange)range;
buffer
必须足够大。- (BOOL)getBytes:(void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(NSRangePointer)leftover;
这个方法不会crash。
获取C字符串(以NULL结尾的字符串)
调用之前先使用- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;
方法确定是否可以无失真的编码。这些方法都不要调用UTF-16,UTF-32编码格式,因为这些包括NULL字节。
- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
这个字符串会在调用者被dealloc之前有效,delloc之后无效。- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
buffer
需要自己分配内存,因此生命周期自己控制。
字符串的比较
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(id)locale;
比较字符串时的选项- NSCaseInsensitiveSearch
- NSLiteralSearch
- NSBackwardsSearch
- NSAnchoredSearch
- NSNumericSearch
- NSDiacriticInsensitiveSearch
- NSWidthInsensitiveSearch
- NSForcedOrderingSearch
- NSRegularExpressionSearch
- 前缀后缀
- (BOOL)hasSuffix:(NSString *)str;
- (BOOL)hasSuffix:(NSString *)str;
- 是否相同
- (BOOL)isEqualToString:(NSString *)aString;
这个方法比isEqual:
方法要快一些。
组合字符串
stringByAppendingFormat:
- (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex;
从padString
的padIndex
开始填充。- [@"abc" stringByPaddingToLength: 9 withString: @"." startingAtIndex:0];
// Results in "abc......" - [@"abc" stringByPaddingToLength: 2 withString: @"." startingAtIndex:0];
// Results in "ab" - [@"abc" stringByPaddingToLength: 9 withString: @". " startingAtIndex:1];
// Results in "abc . . ."
// Notice that the first character in the padding is " "。因为@". "的charAtIndex:1是" "。
- [@"abc" stringByPaddingToLength: 9 withString: @"." startingAtIndex:0];
分隔字符串
- 根据分隔符生成数组。
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;
- 去掉字符串前后的指定字符
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
- 取字符串的一部分
- (NSString *)substring***
类的方法
- 根据分隔符生成数组。
查找字符串
- 字符查找
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
- 字符串查找
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(NSLocale *)locale;
- 按行枚举
- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block;
- 按照
NSStringEnumerationOptions
枚举
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block;
常见的NSStringEnumerationOptions
- NSStringEnumerationByLines
- NSStringEnumerationByParagraphs(段落分隔符是什么)
- NSStringEnumerationByComposedCharacterSequences
一个emoji表情包括若干UTF6 code unit,这个可以按照emoji表情来枚举。

- NSStringEnumerationByWords
- NSStringEnumerationBySentences
- NSStringEnumerationReverse(反向)
- NSStringEnumerationSubstringNotRequired(不会有substring传入到block中,出于性能考虑)
- NSStringEnumerationLocalized
- 字符查找
字符串替换
- `- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;
分行和分页
- 分行符
- U+000A Unicode Character 'LINE FEED (LF)' (\n)
- U+000D Unicode Character 'CARRIAGE RETURN (CR)' (\r)
- U+0085 Unicode Character 'NEXT LINE (NEL)'
- U+2028 Unicode Character 'LINE SEPARATOR'
- U+2029 Unicode Character 'PARAGRAPH SEPARATOR'\r\n, in that order (also known as CRLF)
- 分段符
- ?????
- 分行符
ComposedCharacter
我理解就是由多个UTF16 code unit表示的字符。为了避免被截断,需要确定包含指定index的完整的ComposedCharacter。
- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
确定String在屏幕上的大小
- (CGSize)sizeWithAttributes:(NSDictionary<NSString *,id> *)attrs;
这个函数返回的包括小数,因此需要对返回值调用
ceil
函数。stringByFoldingWithOptions:locale
????找到共同的前缀
- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;
编码相关
- 是否可以以某种形式无失真编码
- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;
- 根据NSData来探测这个NSData的编码格式
+ (NSStringEncoding)stringEncodingForData:(NSData *)data encodingOptions:(NSDictionary<NSStringEncodingDetectionOptionsKey,id> *)opts convertedString:(NSString * _Nullable *)string usedLossyConversion:(BOOL *)usedLossyConversion;
探测编码格式时的选项String Encoding Detection Options
- suggestedEncodingsKey
建议探测的编码格式。是NSSNumebr的数组。会优先考虑这些编码格式。 - disallowedEncodingsKey
不允许的编码格式。是NSNumber的数组。 - useOnlySuggestedEncodingsKey
是否只允许探测建议的编码格式。 - allowLossyKey
是否允许失真解码。 - fromWindowsKey
是否考虑Windows编码格式 - lossySubstitutionKey
失真解码下,不支持的字符被什么替代。是一个NSString对象,默认是U+FFFD
。 - likelyLanguageKey
NSdata可能来来源语言。two-letter ISO 639-1 language code,NSString对象。
- suggestedEncodingsKey
- 转化为NSData
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
- 无失真编码下的最快编码格式
@property(readonly) NSStringEncoding fastestEncoding;
- 无失真编码格式下占用空间最小的格式
@property(readonly) NSStringEncoding smallestEncoding
- 是否可以以某种形式无失真编码
URL相关
- URL编码
- (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;
- 去除URL编码
@property(readonly, copy) NSString *stringByRemovingPercentEncoding;
- URL编码
文件路径相关
- 把字符串用路径分隔符连接起来
class func path(withComponents components: [String]) -> String
- 把路径用分隔符分隔,得到数组
var pathComponents: [String] { get }
把路径表示成系统形式的c字符串
@property(readonly) const char *fileSystemRepresentation;
char filenameBuffer[13];
BOOL success;
success = [@"/mach_kernel" getFileSystemRepresentation:filenameBuffer maxLength:12];
// success == NO
// Changing the length to include the NULL character does work
success = [@"/mach_kernel" getFileSystemRepresentation:filenameBuffer maxLength:13];
// success == YES
获取最后一个路径名字
@property(readonly, copy) NSString *lastPathComponent;

路径扩展名
@property(readonly, copy) NSString *pathExtension;
处理
~
~
扩展为绝对路径
@property(readonly, copy) NSString*stringByExpandingTildeInPath;
- 绝对路径缩写
~
@property(readonly, copy) NSString *stringByAbbreviatingWithTildeInPath;
在路径名后加子路径
- (NSString *)stringByAppendingPathComponent:(NSString *)str;
路径后加后缀
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
删除最后一段路径
@property(readonly, copy) NSString *stringByDeletingLastPathComponent;
删除路径后缀
@property(readonly, copy) NSString *stringByDeletingPathExtension;
解析符号链接(快捷方式)
@property(readonly, copy) NSString *stringByResolvingSymlinksInPath;
标准化路径
@property(readonly, copy) NSString *stringByStandardizingPath;
- 扩展
~
号为绝对路径 - 如果可以,移除起始的
“/private/var/automount”
,“/var/automount”
或“/private”
。 - 处理
//
或/./
- 移除最后一个路径段的尾斜线
- 处理符号链接如
../
- 扩展
- 把字符串用路径分隔符连接起来
更多知识
NSString学习的更多相关文章
- iOS阶段学习第14天笔记(NSString与NSMutableString)
iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...
- NSString字符串类型-学习总结
1.字符串的创建 (1)创建常量字符串 NSString *str = @"This is a String"; //str是变量名 (2)创建空的字符串,给字符串赋值 NSStr ...
- OC本学习笔记Foundation框架NSString与NSMutableString
一.NSString与NSMutableString 相信大家对NSString类都不陌生.它是OC中提供的字符串类.它的对象中的字符串都是不可变的,而它的子类NSMutable ...
- Object C学习笔记8-字符串NSString之二
5. 字符串是否包含 hasPrefix 判断字符串是否以某个字符串开头 hasSuffix 判断字符串是否以某个字符串结尾 NSString *str1=@"Object C学习正在进行中 ...
- OC之NSString、NSMutableString学习笔记 常用方法
NSString篇: 1.字符串连接 NSString *beijing = @"北京"; NSString *welcome = [beijing stringByAppendi ...
- iOS学习13之OC NSString类
C语言中,字符串是有char(ASC||码)字符组成. OC中,字符串是由unichar(Unicode)字符组成. 1.字符串(NSString) NSString:不可变字符串,即:创建以后,内容 ...
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- Objective-C学习篇06—NSString与NSMutableString
NSString OC提供了定义字符串对象的方法,也就是将想要表达的字符串用一对双引号引起来,并在开头加上@.@是OC中的指令符,它告诉编译器@以后的内容为OC中的语法.比如@”Harbingwang ...
- iOS学习 NSString常用技巧
字符串是程序设计最常用的数据类型之一了.在Mac/iPhone编程中,苹果为我们提供了一个不同的字符串类型NSString.有别与普通的String为数据类型,NSString其实是一个对象类型.NS ...
随机推荐
- Windows Azure HandBook (4) 分析Windows Azure如何处理Session
<Windows Azure Platform 系列文章目录> 本文是对笔者之前的文章Windows Azure Cloud Service (13) 多个VM Instance场景下如何 ...
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...
- Entity Framework想说爱你不容易,这么多的报错,这么多的限制,该如何解决?
首先看一下采用MODEL FIRST的方式设计的实体模型对象关系图: 注意:EntityOne中有导航属性:EntityTwo 在如下代码中的几种情况进行新增操作,均会报错,新增都不会成功: stat ...
- WCF序列化
在WCF中,提供了专门用来序列化和反序列操作的类,该类就是DataContractSerializer类.一般而言,WCF会自动选择使用DataContractSerializer来对可序列话数据契约 ...
- 【Swift学习】Swift编程之旅(一)
学习一门新语言最经典的例子就是输出“Hello World!” print("Hello World!") swift就是这样来输出的. 如果你使用过其他语言,那么看上去是非常的熟 ...
- 解决matplotlib的中文问题
matplotlib的强大无需我去言说,但它对使用中文的我来说却有一点瑕疵,那就是--在默认状态下,matplotlb无法在图表中使用中文. 在网上查找了一些资料,发现matplotlib本身是支持U ...
- C语言学习016:单链表
#include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...
- 十条jQuery代码片段助力Web开发效率提升
JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...
- js 模块化历程
作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生 ...
- 'display' VS 'visibility'
常用的display属性值: none此元素不会被显示并且不占用空间: block此元素显示为块级元素,此元素前后会带有换行符: inline默认,此元素会被显示为内联元素,元素前后没有换行符: in ...