NSString内部-长度是如何工作的



我有一个关于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。

最新更新