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

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(“无对

我有一个关于NSString内部的问题。 我想检查字符串长度,基本上我想知道NSString是否知道它的长度/count每次/count&缓存结果

我应该存储它的长度并每次计算或调用length方法吗

要测试一个字符串,我可以测试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)
@fzwo
nil
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)));
    }
}