NSString内部 - 长度如何工作?

adr*_*oye 2 iphone performance cocoa cocoa-touch objective-c

我有一个关于NSString内部的问题.我想检查一个字符串长度,基本上我想知道NSString每次都知道它的长度/计数/计数和缓存结果.

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

为了测试一个字符串,我可以测试nil或者询问它的长度.

if (str != nil) {
  // compute
}

if ([str length]) {
  // compute
}
Run Code Online (Sandbox Code Playgroud)

哪一个最快?哪一个内存效率更高?

谢谢

小智 6

检查nil("无对象")绝对不同于length消息发送到(NSString)对象.只有一个条件检查有效,以测试"空"字符串.("空"字符串是一个对象,因此不是nil.)

更大的问题是:NSString存储长度还是哨点终止(如"普通c字符串")?NSString将长度存储为内部属性,因此它length是O(1)操作.

快乐的编码.


sbo*_*oth 6

以下是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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于所有情况,它应该是O(1).