我有一个关于NSString内部的问题。我想检查字符串长度基本上我想知道NSString是否知道它的长度/每次计数/计数&缓存结果
我应该存储它的长度并每次计算或调用length方法吗?
要测试一个字符串,我可以测试是否为nil或询问它的长度。
if (str != nil) {
// compute
}
if ([str length]) {
// compute
}
哪一个是最快的?哪一个内存效率更高?
谢谢
检查nil
("no object")绝对不是与将length
消息发送给(NSString)对象相同。只有一种条件检查对测试"空"字符串有效。("空"字符串是一个对象,因此不是nil
。)
更大的问题是:NSString存储长度还是它是哨兵终止(像"普通c字符串")?NSString将长度存储为内部属性,因此length
作为O(1)操作。
快乐编码。
CFStringGetLength是如何工作的:
从http://opensource.apple.com/source/cf/cf(- 550.43 -/- cfstring.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)));
}
}
所以对于所有情况都应该是O(1)
测试NSString指针是否为nil和测试NSString的长度,两者在任何方面都不等同。长度为零的NSString对象可以存在,并且指向它的指针不会比较为nil。
据我所知(我很惊讶地发现我错了),NSString的长度作为一个有效引用的属性存储在对象中。缓存长度通常会带来不必要的复杂性。
NSString是不可变类,所以长度一直保持不变。
附录:在两种情况下(字符串为nil和字符串长度为零),对[字符串长度]的测试结果为0/nil/NO。