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)操作.
快乐的编码.
以下是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).
归档时间: |
|
查看次数: |
819 次 |
最近记录: |