Iphone NSString内部-长度是如何工作的?
我有一个关于NSString内部的问题。 我想检查字符串长度,基本上我想知道NSString是否知道它的长度/count每次/count&缓存结果 我应该存储它的长度并每次计算或调用length方法吗 要测试一个字符串,我可以测试nil或询问它的长度Iphone NSString内部-长度是如何工作的?,iphone,objective-c,cocoa-touch,performance,cocoa,Iphone,Objective C,Cocoa Touch,Performance,Cocoa,我有一个关于NSString内部的问题。 我想检查字符串长度,基本上我想知道NSString是否知道它的长度/count每次/count&缓存结果 我应该存储它的长度并每次计算或调用length方法吗 要测试一个字符串,我可以测试nil或询问它的长度 if (str != nil) { // compute } if ([str length]) { // compute } 哪一个最快? 哪一个内存效率更高 感谢NSString是不可变的类,因此长度始终保持不变。检查nil(“无对
if (str != nil) {
// compute
}
if ([str length]) {
// compute
}
哪一个最快?
哪一个内存效率更高
感谢NSString是不可变的类,因此长度始终保持不变。检查
nil
(“无对象”)与向(NSString)对象发送length
消息完全不同。只有一个条件检查对测试“空”字符串有效。(空字符串是一个对象,因此不是nil
)
更大的问题是:NSString是存储长度还是以sentinel终止(如“普通c字符串”)?NSString将长度存储为一个内部属性,因此它,length
,是一个O(1)操作
愉快的编码。测试NSString指针是否为nil和测试NSString的长度这两种方法在任何方面都是不等价的。长度为零的NSString对象可以存在,并且指向该对象的指针将不等于nil
据我所知(如果发现我错了,我会非常惊讶),NSString的长度作为有效引用的属性存储在对象中。缓存长度通常是不必要的复杂性。附录:在这两种情况下(字符串为零和长度为零)对[string length]进行测试的结果均为0/nil/NO。以下是CFStringGetLength的工作原理: (来自)
所以所有情况下都应该是O(1)。一个
NSMutableString
是否也将其长度存储为O(1)属性?我假设(因为它效率更高),但我不确定。这提醒我:我一直想知道,无论是来自Java还是Smalltalk背景,nil到底是什么。它是一个特殊的类(比如在Smalltalk中,没有原语,所有(!)都是一个对象),还是一个等于int 0的常量?我假设由于c根,0,nil,NULL,NO,false都是相同的-0?nil
在as\uu DARWIN\u NULL
中定义,它在as((void*)0)
@fzwonil
和NULL
中定义为表示“无对象”的特殊值nil
是各自“无类型”的唯一居住者:即使存在实现细节泄漏(“0/NULL”),也可以这样认为。也就是说,nil
是一个只能表示一件事的值:“无对象”。可能很有趣,因为它表明Objective-C实际上只是C/C++上的一层;-)[我上面所说的依赖于语义的使用。]
/* Returns length; use __CFStrLength2 if contents buffer pointer has already been computed.
*/
CF_INLINE CFIndex __CFStrLength(CFStringRef str) {
if (__CFStrHasExplicitLength(str)) {
if (__CFStrIsInline(str)) {
return str->variants.inline1.length;
} else {
return str->variants.notInlineImmutable1.length;
}
} else {
return (CFIndex)(*((uint8_t *)__CFStrContents(str)));
}
}